C#十进制舍入从小数点后4位到

时间:2016-05-30 14:49:05

标签: c# rounding

我有一个小数 30.1645m ,通过正常的数学运算应该四舍五入到 30.17 ,但它不会通过Math.Round或decimal.Round这样四舍五入。 C#。这对我来说真的很奇怪。任何人都可以解释和/或提供解决方案吗?

5 个答案:

答案 0 :(得分:1)

30.1645m在正常数学中不会转换为30.17 :)因为点后第3位小于5,它应该转换为30.16。

您可以将以下代码用于您想要的东西(用于将小数点四舍五入到点后的两位数)

{{1}}

答案 1 :(得分:0)

如果您想要总结,可以使用此方法:

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}

用法:

Decimal d = 30.1645m;
decimal d2=RoundUp(d, 2); //Result: 30.17

改编自this answer

答案 2 :(得分:0)

在你的情况下,你可以乘以100,对新数字执行上限,然后除以100。

如果情况并非总是如此,您可以根据操作后要保留的小数位数,告诉您要使用的10的幂。

答案 3 :(得分:0)

您必须了解舍入的工作方式,数字30.1645将四舍五入为30.16而不是30.17,如您所说,因为舍入算术逻辑舍入到大于或等于小数位5的下一个十进制数这意味着在您的数字0.16 4 5时, 4 将向下舍入为0,因为它小于5且数字为30.16 5 5它将四舍五入为30.17,这是算术运算的四舍五入。

static void Main(string[] args)
        {
            decimal originalValue = 30.1645M;
            Console.WriteLine(originalValue.ToString());

            // straight forward rounding 
            decimal roundedValue = Math.Round(originalValue, 2);
            Console.WriteLine(roundedValue.ToString());

            Console.ReadKey();
        }

答案 4 :(得分:-1)

你所看到的被称为银行家四舍五入。它在IEEE 754中定义,并在MSDN参考中也有说明。当你考虑负数和正数时,这种方法没有偏见。

另见https://en.wikipedia.org/wiki/Rounding