17

我在 VB.Net 的 Math.Round 函数中遇到了一个奇怪的情况

Math.Round((32.625), 2)

结果:32.62

Math.Round((32.635), 2)

结果:32.64

我需要32.63,但在这些情况下,该函数以不同的逻辑工作。

我可以得到小数部分并在上面做我想做的事情。但这不是太奇怪了,一个是四舍五入到更高,一个是四舍五入到更低。

那么我怎样才能得到32.625得到32.63而不会弄乱小数部分呢?(作为数学的自然逻辑)

4

5 回答 5

39

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)
于 2013-02-12T14:48:48.553 回答
4

试试这个(从记忆中):

Math.Round((32.635), 2, MidPointRounding.AwayFromZero)

于 2013-02-12T14:49:36.930 回答
2

尝试这个。

Dim d As Decimal = 3.625
    Dim r As Decimal = Math.Ceiling(d * 100D) / 100D
    MsgBox(r)

这应该做你想要的。

于 2013-02-12T14:44:54.777 回答
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 等。因此,如果您需要对多个数字进行舍入,它不会那么乏味,并且可以节省大量输入。

希望这可以帮助。

于 2013-02-12T15:05:31.373 回答
-1

你不能使用像 32.625 这样的数字在 VB.Net 中被处理的浮点数。(还有@StevenDoggart 提到的银行家四舍五入的问题——你可能不得不同时处理这两个问题。)

问题是存储的数字与输入的不完全一致,因为这些数字没有以固定的二进制表示形式存储,例如 32.625 存储为 32.62499997,而 32.635 存储为 32.63500001。
准确的唯一方法是将数字存储为 Decimal 类型

DIM num as Decimal
num = ToDecimal("32.625")
于 2013-02-12T14:48:31.700 回答