甚至在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.965
, MidpointRounding
值才会起作用。换句话说,该值必须为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
Floor与ceiling相反,它返回最接近数字的最大整数。
因此, 9996.535789
的上限是9997
。
两者都不同于舍入到没有小数点,实际上返回最接近数字的整数,无论它是更小还是更大 – 以最接近的为准; 这就是你使用四舍五入时得到99.97
原因。