VB6 Round(x,0) 问题

4

很久以前,我公司遇到了一些意外结果的问题,我找到了这个问题:

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

当双精度数的整数部分大于5时,四舍五入函数能够正常工作,但是当整数部分小于等于5时,它就不能正常工作。

我该如何解决这个问题?是否有其他函数可以得到正确的四舍五入结果?


https://dev59.com/E0bRa4cB1Zd3GeqP4uMX - MarkJ
在这种情况下,我将使用 r=int(k+0.5) - SBF
2个回答

5
这被称为“银行家舍入法”,试图根据最接近的数字是奇数还是偶数来分配四舍五入结果。
要向上舍入.5:
cint(format(182.5, "#0")) ''183
cint(format(186.5, "#0")) ''187

然而,需要注意的是,Format$将Double转换为String,然后再将其转换回Int。这非常低效。没有$符号的Format甚至更糟,因为它会产生一个Variant。 - user1889116

1
好的,首先,它并不像你所说的那样。
k = 182.5
r = Round(k, 0)

确实会产生182,但是

k = 186.5
r = Round(k, 0)

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

k = 185.5
r = Round(k, 0)

如果你想始终将0.5向上舍入,请使用

银行家舍入法,它是VB6的标准。这样做的目的是消除总是将中间值四舍五入为偶数的偏差。

这样做也会产生186的结果。

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

如果您希望始终将0.5向下舍入,可以使用以下类似的内容
k = 186.5
r = Int(k * 2 + 0.99) \ 2

在小数点后添加与有效数字位数相同数量的9。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接