VB6 Round(x,0) 问题

VB6 Round(x,0) issue

很久以前我公司发生了一些意外结果,我发现了这个问题:

Dim k As Double
Dim r As Integer
k = 182.5
r = Round(k,0)

r 的结果是 182,这给我公司带来了问题,现在我必须修复它。

事情是我观察到的:

Dim k As Double
Dim r As Integer
k = 186.5
r = Round(k,0)

r = 187

当 double 的整数部分的单位大于 5 时,Round 会达到我的预期,但单位 <=5 时它不会。

我该如何解决这个问题?是否有其他函数可以进行正确的舍入?

这称为 bankers rounding 并尝试根据最接近的数字是奇数还是偶数在 .5 上分配舍入 up/down。

在 .5 上四舍五入:

cint(format(182.5, "#0")) ''183
cint(format(186.5, "#0")) ''187

嗯,首先,不是你说的那样。

k = 182.5
r = Round(k, 0)

确实会产生 182,但是

k = 186.5
r = Round(k, 0)

会产生 186,而不是你提到的 187。现在,

k = 185.5
r = Round(k, 0)

也将产生 186。这称为 Banker's Rounding 并且是 VB6 中的标准。目的是消除总是四舍五入的偏见。

如果您希望始终向上舍入 0.5,请使用

k = 186.5
r = Int(k * 2 + 1) \ 2

如果你想总是向下舍入 0.5,你可以使用类似

的东西
k = 186.5
r = Int(k * 2 + 0.99) \ 2

小数点后有多少位有效数字就加多少个9。