甚至在C#中四舍五入

我没有看到Math.Round的结果。

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97 

据我所知,MidpointRounding.ToEven,千分之五的位置应该使输出为99.96。 这不是这种情况吗?

我甚至试过这个,但它也返回99.97:

 return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100; 

我错过了什么

谢谢!

你实际上并不是中点。 MidpointRounding.ToEven表示如果您的数字为99.965 ,即99.96500000 [等], 那么您将获得99.96。 由于您传递给Math.Round的数字高于此中点,因此它正在四舍五入。

如果您希望将数字舍入为99.96,请执行以下操作:

 // this will round 99.965 down to 99.96 return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven); 

嘿,这里有一个方便的小函数来完成上面的一般情况:

 // This is meant to be cute; // I take no responsibility for floating-point errors. double TruncateThenRound(double value, int digits, MidpointRounding mode) { double multiplier = Math.Pow(10.0, digits + 1); double truncated = Math.Truncate(value * multiplier) / multiplier; return Math.Round(truncated, digits, mode); } 

如果你在中点本身,它只会达到99.96,即99.965:

 C:\ TEMP> IPY
 .NET 2.0.50727.4927上的IronPython 2.6 Beta 2(2.6.0.20)
输入“帮助”,“版权”,“信用”或“许可”以获取更多信息。
 >>> import clr
 >>>来自System import Math,MidpointRounding
 >>> Math.Round(99.9651,2,MidpointRounding.ToEven)
 99.97
 >>> Math.Round(99.965,2,MidpointRounding.ToEven)
 99.96
 >>> Math.Round(99.9649,2,MidpointRounding.ToEven)
 99.96
 >>> Math.Round(99.975,2,MidpointRounding.ToEven)
 99.98
 >>>

当您尝试对最低有效位正好为5的值进行99.965MidpointRounding值才会起作用。换句话说,该值必须为99.965才能获得所需的结果。 由于这不是这种情况,您只需观察标准的舍入机制。 有关详细信息,请参阅MSDN页面 。

以下是对该主题有所了解的结果:

 Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97 Math.Round(99.965, 2, MidpointRounding.ToEven); // returning 99.96 Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96 

中点恰好是5 …而不是535789,而不是499999。

仅当值介于两种情况之间时,才会查看中点舍入。

在你的情况下,它不是“5”,它是“535 ……”,所以它大于中点,并且例程为.96。 为了得到你期望的行为,你需要转换到第三个小数点,然后使用MidpointRounding.ToEven进行回合。

Math.Round’将十进制值舍入到指定数量的小数位。 当圆形99.96500000,2轮到99.96和99.96500001到99.67。 它完整​​的价值。

如果是我,我不会使用Math.Round() ,因为那不是你想要完成的。

这就是我要做的:

 double num = 99.96535789; double percentage = Math.Floor(100 * num) / 100; 

这更容易阅读,更多的是数学方法。
我将数字乘以100 ,现在我有9996.535789
然后将它与舍入区别开来,以返回最接近该数字的最小整数,得到9996
然后我除以100得到所需的99.96

PS
Floorceiling相反,它返回最接近数字的最大整数。
因此, 9996.535789的上限是9997
两者都不同于舍入到没有小数点,实际上返回最接近数字的整数,无论​​它是更小还是更大 – 以最接近的为准; 这就是你使用四舍五入时得到99.97原因。