我在 VB.Net 的 Math.Round 函数中遇到了一个奇怪的情况
Math.Round((32.625), 2)
结果:32.62
Math.Round((32.635), 2)
结果:32.64
我需要32.63,但在这些情况下,该函数以不同的逻辑工作。
我可以得到小数部分并在上面做我想做的事情。但这不是太奇怪了,一个是四舍五入到更高,一个是四舍五入到更低。
那么我怎样才能得到从32.625得到32.63而不会弄乱小数部分呢?(作为数学的自然逻辑)
我在 VB.Net 的 Math.Round 函数中遇到了一个奇怪的情况
Math.Round((32.625), 2)
结果:32.62
Math.Round((32.635), 2)
结果:32.64
我需要32.63,但在这些情况下,该函数以不同的逻辑工作。
我可以得到小数部分并在上面做我想做的事情。但这不是太奇怪了,一个是四舍五入到更高,一个是四舍五入到更低。
那么我怎样才能得到从32.625得到32.63而不会弄乱小数部分呢?(作为数学的自然逻辑)
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 节。在多个舍入操作中使用时,它可以减少由于在单个方向上始终舍入中点值而导致的舍入误差。在某些情况下,这种舍入误差可能很大。
所以,你想要的是:
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)
试试这个(从记忆中):
Math.Round((32.635), 2, MidPointRounding.AwayFromZero)
尝试这个。
Dim d As Decimal = 3.625
Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
MsgBox(r)
这应该做你想要的。
她有一个快速功能,您可以添加它来简化您的生活,并让您不必一直打字太多。
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 等。因此,如果您需要对多个数字进行舍入,它不会那么乏味,并且可以节省大量输入。
希望这可以帮助。
你不能使用像 32.625 这样的数字在 VB.Net 中被处理的浮点数。(还有@StevenDoggart 提到的银行家四舍五入的问题——你可能不得不同时处理这两个问题。)
问题是存储的数字与输入的不完全一致,因为这些数字没有以固定的二进制表示形式存储,例如 32.625 存储为 32.62499997,而 32.635 存储为 32.63500001。
准确的唯一方法是将数字存储为 Decimal 类型
DIM num as Decimal
num = ToDecimal("32.625")