修复VB6中的运算符问题

修复VB6中的运算符问题,vb6,Vb6,全部,, 我是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,为什么?如果您将此作为一种解决方法,我认为您将得到预期的结果: Dim a As Double, b As Doubl

全部,, 我是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,为什么?

如果您将此作为一种解决方法,我认为您将得到预期的结果:

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
:

Int,修复函数

返回数字的整数部分

。。。注释Int和Fix删除数字和的小数部分 返回结果的整数值

(来自VBA文档,但对于VB6应相同)


显然,当VB在函数调用的上下文中计算
a/b
时,它会产生一个非常轻微的<7的浮点值。

顺便说一句,另一个让它工作的技巧-取决于需要使用的浮点数-是使用
货币
而不是
双精度

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

因为你在处理浮点数。简言之:虽然58333.31/8333.33的结果看起来是7,但在内部它不是,而是6.SomethingVerCyclosetO7,这反过来(正确地)四舍五入到最接近的较低整数=6。另请参见,最好将
Fix()
看作是“向0截断”,然后是“向下舍入”。例如,与
Int()
相反。你必须考虑负值才能看到区别。内置函数圆(表达式[,NoxDimialPosits ])在这里可能有帮助,但是你仍然必须考虑许多(大部分)小数位数不能精确地表示在二进制浮点中,不管精度如何。这是一个更好的解决方案,它解决了我的问题。