vba修复函数,双重比较返回意外的值
在vba中修复函数返回2时,通过3:
Debug.Print (Fix(Log(1000) / Log(10)))
– >这打印2而不是3
这是为什么?
Log(1000)/Log(10)
或6.90775527898214÷2.30258509299405应该等于3,但似乎15位浮点精度正在生成一个15位精度浮点错误和Fix是trucating所有小数。 如果舍入到小数点后15位以消除无限小的错误,您将收到3个答案。
?round(log(1000)/log(10), 15)
Debug.Print Log(1000) '6.90775527898214 Debug.Print Log(10) '2.30258509299405 6.90775527898214 / 2.30258509299405 =2.999999999999996 'VBA is convering this to '3#' Debug.Print Fix(3#) '2 Debug.Print Round(Fix(Log(1000) / Log(10))) '2 Debug.Print Round(Round(Fix(Log(1000)) / Round(Log(10)))) '3 (This is what you want) Debug.Print (Round(Fix(Log(1000)) / Round(Log(10)))) '3 (Or may be only this)
在日志function上进行debugging:
Public Sub Test() Dim number As Double number = Log(1000) Debug.Print number End Sub
打印:6.90775527898214
和
Public Sub Test() Dim number As Double number = Log(10) Debug.Print number End Sub
版画:2.30258509299405
当你划分的那些你得到:2.(很多9),并调用修复这个数字会给你2不是3。
嗯 – 我认为这是如何处理日志VB如何工作表函数处理它。 使用这个,我得到3
:
Debug.Print fix(worksheetfunction.log10(1000)/worksheetfunction.log10(10))
我记得我和Logs有类似的问题,就这么问了,所以也许这是一个相关的问题。
当您使用浮点数(单数据types(Visual Basic)和双数据types(Visual Basic))时,请记住它们存储为二进制分数。 这意味着它们不能保存任何不是二元分数的数量的确切表示(forms为k /(2 ^ n),其中k和n是整数)。 例如,0.5(= 1/2)和0.3125(= 5/16)可以保持为精确值,而0.2(= 1/5)和0.3(= 3/10)只能是近似值。
https://msdn.microsoft.com/en-us/library/ae382yt8.aspx
所以我所做的是创build了另一个修复function,看起来像这样:'修复有问题
Public Function FixModified(ByVal x As Double, ByVal threshold As Double) If Fix(x) = x Then FixModified = x ElseIf Fix(x) + 1 - x < threshold Then FixModified = Fix(x) + 1 Else FixModified = Fix(x) End If End Function
我现在通过的门槛是0.000000000001,它按预期工作。