获取最后2位小数,不进行四舍五入。

10

在C#中,我想获取一个double类型数字的最后两位,不进行任何舍入。我已经尝试过从Math.FloorMath.Truncate的所有方法,但都没有成功。

以下是我想要的结果示例:

1,424.2488298 -> 1,424.24
53.5821 -> 53.58
10,209.2991 -> 10,209.29

有什么想法吗?


1
如果你在使用十进制,为什么不使用decimal而使用double呢? - Eric Lippert
你可以访问这篇文章,找到适合你的内容 http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html - Alexa Adrian
6个回答

26

数学上很简单:

var f = 1.1234;
f = Math.Truncate(f * 100) / 100;  // f == 1.12

将小数点向右移动两位,强制转换为整数以截断小数部分,再将其向左移动两位。可能还有一些框架中的方法可以实现,但我现在不能查看。您可以将其泛化:

double Truncate(double value, int places)
{
    // not sure if you care to handle negative numbers...       
    var f = Math.Pow( 10, places );
    return Math.Truncate( value * f ) / f;
}

并不简单。双精度浮点数具有比整数更大的范围。 - Joe
@joe:啊,好主意,使用Math.Truncate而不需要转换。 - Ed S.
@EdS,我尝试使用您的第一种方法将它应用于数值136.2025,但它被舍入为了136.2并且0被省略了。有没有办法让它保留0呢? - mint
7
@mint: 好的,现在你谈论的是显示,而不是数字本身。 136.2136.20136.2000000之间没有区别。如果您想以特定的显示位数打印,则可以查看对String.Format的调用中的字符串格式设置。 - Ed S.
@mint:一定要注意Eric Lippert在他的帖子中所说的内容。如果乘法的结果超过了“double”的最大值,你最好使用“decimal”类型,否则乘法将失败。 - Ed S.

15

我的建议是:首先停止使用double。如果你需要十进制舍入,那么很可能你应该使用decimal。请问你的应用程序是什么?

如果你确实有一个double,可以这样做:

double r = whatever;
decimal d = (decimal)r;
decimal truncated = decimal.Truncate(d * 100m) / 100m;

请注意,如果双精度浮点数的绝对值大于792281625142643375935439504,则此技术将失败,因为乘以100会失败。 如果您需要处理如此大的值,则需要使用特殊技术。(当然,当一个双精度浮点数如此大时,它已经远远超出了以两位小数表示值的能力。)


6
 double d = Math.Truncate(d * 100) / 100;

2
Math.Round(NumberToRound - (double)0.005,2)

i.e

Math.Round(53.5821 - (double)0.005,2) // 53.58
Math.Round(53.5899 - (double)0.005,2) // 53.58
Math.Round(53.5800 - (double)0.005,2) // 53.58

2
一般解决方案:
    public static double SignificantTruncate(double num, int significantDigits)
    {
        double y = Math.Pow(10, significantDigits);
        return Math.Truncate(num * y) / y;
    }

那么

    double x = 5.3456;
    x = SignificantTruncate(x,2);

将会产生所需的结果 x=5.34


0

Octane 对你的回答进行了概括,它不会受到超过最大值的影响。运行得非常好:)

int dec = 4; 
return Math.Round(val - (decimal)(5 / Math.Pow(10,dec+1)), dec)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接