我在VB.Net中的Math.Round函数中有一个如此奇怪的情况
Math.Round((32.625), 2)
Run Code Online (Sandbox Code Playgroud)
结果:32.62
Math.Round((32.635), 2)
Run Code Online (Sandbox Code Playgroud)
结果:32.64
我需要32.63,但在这些情况下,该功能在不同的逻辑中工作.
我可以得到小数部分并做出我想做的事情.但是这不是太奇怪了,一个是向上走向更高,一个是向下走向更低.
那么如何从32.625获得32.63而不会弄乱小数部分呢?(作为数学的自然逻辑)
Ste*_*art 36
Math.Round默认情况下使用银行家的舍入.您可以通过指定其他MidPointRounding选项来更改它.来自MSDN:
偏离零
中点值四舍五入到远离零的下一个数字.例如,3.75轮至3.8,3.85轮至3.9,-3.75轮至-3.8,以及-3.85轮至-3.9.这种舍入形式由MidpointRounding.AwayFromZero枚举成员表示.从零开始舍入是最广为人知的舍入形式.
四舍五入到最近,或银行家的四舍五入
中点值四舍五入到最接近的偶数.例如,3.75和3.85都是3.8到3.8,-3.75和-3.85都是-3.8.这种舍入形式由MidpointRounding.ToEven枚举成员表示.
舍入到最接近的是财务和统计操作中使用的标准舍入形式.它符合IEEE标准754第4节.当用于多个舍入操作时,它减少了由于在单个方向上始终舍入中点值而导致的舍入误差.在某些情况下,这种舍入误差可能很大.
那么,你想要的是:
Math.Round(32.625, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635, 2, MidpointRounding.AwayFromZero)
Run Code Online (Sandbox Code Playgroud)
正如其他人所提到的,如果精度很重要,那么你应该使用Decimal变量而不是浮点类型.例如:
Math.Round(32.625D, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero)
Run Code Online (Sandbox Code Playgroud)