我在VB.Net中的Math.Round函数中遇到了一个奇怪的案例
Math.Round((32.625), 2)
结果:32.62
Math.Round((32.635), 2)
结果:32.64
我需要 32.63 ,但在这些情况下,该功能的工作原理不同。
我可以得到小数部分,然后做我想做的事情。但是这不是太奇怪,一个是向上走向更高,一个是四舍五入到更低。
那么如何从 32.625 获得 32.63 而不会弄乱小数部分? (作为数学的自然逻辑)
答案 0 :(得分:35)
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.75和-3.85回合均为 -3.8。这种舍入形式由MidpointRounding.ToEven枚举成员表示。
舍入到最近是财务中使用的舍入的标准形式 和统计业务。它符合IEEE标准754部分 4.当在多个舍入操作中使用时,它减少了由于始终舍入a中的中点值而导致的舍入误差 单向。在某些情况下,这种舍入错误可能是 显著。
所以,你想要的是:
Math.Round(32.625, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635, 2, MidpointRounding.AwayFromZero)
正如其他人所提到的,如果精度很重要,那么您应该使用Decimal
变量而不是浮点类型。例如:
Math.Round(32.625D, 2, MidpointRounding.AwayFromZero)
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero)
答案 1 :(得分:3)
试试这个(从内存中):
Math.Round((32.635), 2, MidPointRounding.AwayFromZero)
答案 2 :(得分:2)
试试这个。
Dim d As Decimal = 3.625
Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
MsgBox(r)
这应该做你想要的。
答案 3 :(得分:2)
她可以添加一个快速功能,以简化您的生活并使其成为您不必一直打字的原因。
Private Function roundd(dec As Decimal)
Dim d As Decimal = dec
Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
Return r
End Function
将此添加到您的应用程序,然后使用函数
roundd(3.624)
或任何你需要的东西。
显示结果 - 示例
msgbox(roundd(3.625))
这将显示一个3.63
的消息框Textbox1.text = roundd(3.625)
这将设置textbox1.text - 3.63等。 因此,如果您需要对一个以上的数字进行舍入,那么它将不会那么繁琐,您可以节省大量的输入。
希望这会有所帮助。
答案 4 :(得分:-1)
你不能使用像VB.Net那样处理像32.625这样的数字的浮点数。 (还有@StevenDoggart提到的银行家四舍五入的问题 - 你可能不得不处理这两个问题。)
问题是存储的数字并不完全是输入的数字,因为这些数字不是固定的二进制表示,例如32.625存储为32.62499997,32.635存储为32.63500001 唯一的方法是将数字存储为Decimal
类型DIM num as Decimal
num = ToDecimal("32.625")