为什么大数的math运算有时需要一个中间variables才能返回正确的结果呢?

我一直在这里使用Excel 2013。 例如,

Public Function RoundTest(ByVal flNumber As Double) As Double RoundTest = Round(flNumber) End Function Public Function Test( _ ByVal flNumber As Double, _ ByVal flDivisor As Double) _ As Double Test = flNumber - (RoundTest(flNumber / flDivisor) * flDivisor) End Function 

flDivisor作为10来电传递。 用flNumber <= 10 ^ 22调用Test()得到一个正确的结果,即0 ,但是当flNumber > 10 ^ 22时Test()返回一个错误的结果,即一个负数。 但是,如果使用中间variables临时保存计算的部分结果,则Test()将返回正确的结果,即0

 Public Function Test( _ ByVal flNumber As Double, _ ByVal flDivisor As Double) _ As Double Dim flTemp As Double flTemp = RoundTest(flNumber / flDivisor) * flDivisor Test = flNumber - flTemp End Function 

为什么发生这种情况? 我怎样才能避免这个特点?

这里是更直接的例子:

 Public Function RoundTest(ByVal flNumber As Double) As Double RoundTest = Round(flNumber) End Function Sub TestCDbl() Dim a As Double Dim b As Double a = 10 ^ 23 b = 10 w1 = a - RoundTest(a / b) * b ' -8388608 w2 = a - Round(a / b) * b ' 0 w3 = a - CDbl(RoundTest(a / b) * b) ' 0 End Sub 

IMO内部实现的计算工作,以便以不同方式处理从RoundTest()函数返回的本地Round()函数的结果。 也可以处理任何expression的部分,尤其是减半不作为双重types,并具有明确的转换为CDbl()加倍可能有助于你的情况,而不是通过分配给双重types的临时variables强制。
你必须记住,这个努力和类似的东西并不能保证解决这个问题。 每个计算都会引入浮点错误,正如@Comintern所评论的那样。