获取最后2个没有舍入的小数位数

时间:2012-03-29 19:05:52

标签: c# rounding decimal

在C#中,我试图得到一个双精度的最后两位小数,没有四舍五入。我已经尝试了从Math.FloorMath.Truncate的所有内容,但没有任何效果。

我想要的结果样本:

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

有什么想法吗?

5 个答案:

答案 0 :(得分:23)

嗯,数学上很简单:

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

将小数点移动到右边的两个位置,转换为int以截断,将其移回左边两个位置。框架中可能还有一些方法可以做到这一点,但我现在看不出来。你可以概括一下:

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;
}

答案 1 :(得分:14)

我的建议:首先停止使用double 。如果你需要十进制舍入,那么你应该使用decimal的赔率很高。你的申请是什么?

如果你有双,你可以这样做:

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

请注意,如果double的绝对值大于792281625142643375935439504,则此技术将失败,因为乘以100将失败。如果您需要处理大的值,那么您将需要使用特殊技术。 (当然,在双倍大的时候,你还远远超出它在小数位后用两位数表示值的能力。)

答案 2 :(得分:6)

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

答案 3 :(得分: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

答案 4 :(得分:2)

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

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