我有一个小数 30.1645m ,通过正常的数学运算应该四舍五入到 30.17 ,但它不会通过Math.Round或decimal.Round这样四舍五入。 C#。这对我来说真的很奇怪。任何人都可以解释和/或提供解决方案吗?
答案 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参考中也有说明。当你考虑负数和正数时,这种方法没有偏见。