VB6浮点计算问题

VB6浮点计算问题,vb6,floating,Vb6,Floating,这是浮点计算的问题(我想) 这是我在某处找到的2轮函数 它们在代码中看起来非常相似,但当我运行它时,我得到了两个不同的结果 在本例中,当运行此代码时,值为87.13225,精度为4: a=87.1322 b=87.1323 谁能解释发生了什么 Private Sub Form_Load() Dim a# Dim b# a = Round1(87.13225, 4) '87.1322 b = Round2(87.13225, 4) '87.1323 End Sub

这是浮点计算的问题(我想)

这是我在某处找到的2轮函数

它们在代码中看起来非常相似,但当我运行它时,我得到了两个不同的结果

在本例中,当运行此代码时,值为87.13225,精度为4:

a=87.1322

b=87.1323

谁能解释发生了什么

Private Sub Form_Load()
    Dim a#
    Dim b#
    a = Round1(87.13225, 4) '87.1322
    b = Round2(87.13225, 4) '87.1323
End Sub

Private Function Round1(ByVal value#, ByVal vPrecision%)
    Round1 = Fix((value + Sgn(value) / 10 ^ vPrecision / 2) * _
                10 ^ vPrecision) _
            / 10 ^ vPrecision
End Function

Private Function Round2(ByVal value#, ByVal vPrecision%)
    Dim a#
    a = (value + Sgn(value) / 10 ^ vPrecision / 2) * 10 ^ vPrecision
    Round2 = Fix(a) / 10 ^ vPrecision
End Function

我相信,你的部分问题涉及类型转换。由于您传递的文字参数没有定义为double,我相信它们是作为single传递的,然后转换为double,这可能会影响您的结果。尝试将文本作为87.12335#传递给每个方法。另外,您没有定义这两个函数的输出类型,所以我相信它返回的是变量。我认为这两种方法都应该以“As Double”结尾


最后,你为什么要试图重新发明轮子?VB6能够进行两种不同的舍入。是VB6的默认舍入方案。这让我很惊讶,我编写了会计软件。银行家四舍五入总是四舍五入到最接近的偶数,所以两个结果都应该是87.1234。按银行家的四舍五入计算,87.12345也将四舍五入至87.1234。如果您希望舍入总是从零舍入,这是我更熟悉的,您应该使用各种格式方法,即FormatNumber、format$等。上面引用的页面上有一个链接进一步解释了这一点。当我发现这种差异时,我制定了自己的取整程序,根据客户的喜好,使用银行家取整或我称之为标准取整。

这可能会有所帮助:浮点运算不是完全精确的。我可以写一个详细的答案来解释为什么这会发生在代码中,但它很可能很复杂,而且比您真正想知道的还要多。更重要的是,它不会帮助你解决问题。说到这里,你想解决的问题是什么?当以不同的方式执行浮点运算时,永远不能保证得到相同的结果。另见:德布罗克,科迪:谢谢你的回答。第一段中的推测是不正确的。
#
类型后缀表示Double,因此参数实际上以
作为Double结尾。这意味着参数不是作为单变量传递的,而是作为双变量传递的,因为这是它们的显式类型。现在,经典VB确实以适合它们的最低精度类型存储文本,因此这些文本实际上可能是单文本,但是当它们被传递到一个将其参数作为双倍的函数时,类型提升就会发生,并且不会损失精度。(这是一个不断扩大的转换)谢谢你的回答。我还想用银行家四舍五入法。但这是我们20年来的客户代码,所以我想保持它的逻辑,而不是重新发明轮子。对于我的问题,@deblocker的回答是正确的。