这是浮点计算问题(我认为)。
这是我在某处发现的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
答案 0 :(得分:0)
我认为,部分问题涉及类型转换。由于您传递的文字参数未定义为double,我相信它们将作为单曲传递,然后转换为双精度,这可能会影响您的结果。尝试将文字传递给每个方法,如87.12335#。此外,您还没有定义任何功能的输出类型,因此我相信它会返回变体。我相信这两种方法都应以"正如Double"
最后,你为什么试图重新发明轮子? VB6能够进行两种不同的舍入。 Banker's Rounding是VB6的默认舍入方案。这令我感到惊讶,我写会计软件。银行家的舍入总是四舍五入到最接近的偶数,因此你的两个结果应该是87.1234。在银行家的四舍五入中,87.12345也将转为87.1234。如果你想要它总是从零舍入的舍入,这是我更熟悉的,你应该使用各种格式方法,即FormatNumber,Format $等。上面引用的页面上有一个链接解释这个进一步。当我发现这种差异时,我根据客户的喜好,使用Banker的四舍五入或我称之为标准舍入的方式进行了自己的舍入程序。