【发布时间】:2017-05-27 04:07:38
【问题描述】:
这是浮点计算问题(我认为)。
这是我在某处找到的 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
【问题讨论】:
-
浮点运算并不十分精确。我可以写一个详细的答案来解释为什么会在你的代码中发生这种情况,但它很可能很复杂,而且比你真正想知道的要多。更重要的是,它不会帮助您解决问题。说到这里,您要解决的是问题是什么?当您以不同的方式执行浮点运算时,永远无法保证您会得到相同的结果。另见:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
-
deblocker,Cody:谢谢你的回答。