解决VB6中的运算符问题。

3

大家好,我对VB6有一定的了解。我想从两个双精度数相除中得到余数。我使用了逗号,

Dim a As Double, b As Double, result As Double
b = 8333.33
a = 58333.31

result = a - (b * Fix(a / b))

结果应该是0。但实际上不是。 a/b=7,没有余数。因此Fix(a / b)应该是7。但是Fix(a / b)=6,为什么呢?


2
因为你正在处理浮点数。这里有解释。简而言之:虽然58333.31 / 8333.33的结果似乎是7,但在内部它不是,而是6.非常接近7,这又被(正确地)四舍五入到最接近的较低整数= 6。另请参见此SO帖子 - Hel O'Ween
最好将 Fix() 视为“向0截断”而不是“向下取整”。与例如 Int() 相反。您必须考虑负值以看到区别。 - Bob77
内置函数Round(expression [,numdecimalplaces])在这里可能会有所帮助,但您仍然必须考虑到许多(大多数)小数无论精度如何,在二进制浮点数中都无法准确表示。 - Mark Moulding
2个回答

3

顺便提一下,让它正常工作的另一个技巧 - 取决于您需要处理的浮点数 - 是使用 Currency 而不是 Double

Dim a As Currency, b As Currency

b = 8333.33
a = 58333.31

Debug.Print Fix(a / b) ' Returns 7
Debug.Print a - (b * Fix(a / b)) ' Returns 0

这是一个更好的解决方案,它解决了我的问题。 - PLAA Hemantha

2
如果您使用这种方法作为解决办法,我认为您将获得您期望的结果:
Dim a As Double, b As Double, intermediate As Double, fixed1 As Double, fixed2 As Double

b = 8333.33
a = 58333.31

intermediate = a / b
fixed1 = Fix(intermediate)
fixed2 = Fix(a / b)

Debug.Print intermediate ' 7
Debug.Print fixed1       ' 7
Debug.Print fixed2       ' 6
Fix函数的文档如下:
Int、Fix函数返回数字的整数部分。
...备注:Int和Fix函数都会删除数字的小数部分,并返回结果整数值。
(这是来自VBA文档,但VB6应该是相同的)。
显然,当VB在函数调用的上下文中评估a / b时,它会得到一个略小于7的浮点值。

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