VB.Net中的Math.Round()有什么问题?

Mto*_*tok 16 vb.net

我在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)