VB6浮点计算问题

时间:2017-05-27 04:07:38

标签: vb6 floating

这是浮点计算问题(我认为)。

这是我在某处发现的2轮功能。

它们在代码中看起来非常相似但是当我运行它时,我得到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

1 个答案:

答案 0 :(得分:0)

我认为,部分问题涉及类型转换。由于您传递的文字参数未定义为double,我相信它们将作为单曲传递,然后转换为双精度,这可能会影响您的结果。尝试将文字传递给每个方法,如87.12335#。此外,您还没有定义任何功能的输出类型,因此我相信它会返回变体。我相信这两种方法都应以"正如Double"

最后,你为什么试图重新发明轮子? VB6能够进行两种不同的舍入。 Banker's Rounding是VB6的默认舍入方案。这令我感到惊讶,我写会计软件。银行家的舍入总是四舍五入到最接近的偶数,因此你的两个结果应该是87.1234。在银行家的四舍五入中,87.12345也将转为87.1234。如果你想要它总是从零舍入的舍入,这是我更熟悉的,你应该使用各种格式方法,即FormatNumber,Format $等。上面引用的页面上有一个链接解释这个进一步。当我发现这种差异时,我根据客户的喜好,使用Banker的四舍五入或我称之为标准舍入的方式进行了自己的舍入程序。