Excel 支持什么精度?我尝试计算0.800000000000001 / 2
并获得了错误的结果0.40000000000000000000
,而它应该是0.4000000000000005
答案1
Excel 支持浮点运算,小数位限制为 15 位。以下是调查和参考。
在研究该主题时发现,算术量仅存储了 15 位数字,怀疑是由于浮点表示法造成的。
经过寻找这个嫌疑犯,找到了以下参考资料: https://support.microsoft.com/en-us/kb/78113和这里https://support.microsoft.com/en-us/kb/214118
因此,浮点的最大进位是 15 位小数。以下是 14 位小数的相同示例。请注意小数点后 14 位的 5;进一步说明了浮点数的限制。
为了验证论坛中一位成员评论的理论,我决定添加此附录。不,即使在 VBa 中,Double 变量也无法超越浮点限制。我使用了双精度并将值返回为字符串,以进一步演示:
规则的例外!
谢谢你,罗恩·罗森菲尔德。关于最后一张图片,关于 VBa。如果您使用的是 VBa 代码,那么利用VBa library function CDec()
确实可以捕获上述限制中未涵盖的精度。但是,有一个警告,您必须将数据作为字符串返回以用于显示目的。可以在此处找到参考:http://www.techonthenet.com/excel/formulas/cdec.php
答案2
下面是一个示例,说明如何在简单的数学运算中使用 VBA Decimal 数据类型,以获得比 Excel 的 15 位小数精度更高的精度。
显然,您可以扩展它以用于其他类型的操作。但是,如果 28 位小数精度或允许的数字范围(请参阅帮助)不够,您将需要使用其他工具。
以下示例仅适用于加法、乘法和除法。但您可以根据实际需要轻松将其扩展到其他运算,或以不同的方式实现。
请注意,结果以字符串(文本)的形式返回。否则 Excel 将无法显示结果。如果您仅在 VBA 中使用它,则可以将结果返回为变量/十进制。
Function HiPrecMath(sOp As String, ParamArray Factors() As Variant) As String
Dim V As Variant
V = Factors
If sOp Like "Add*" Then
HiPrecMath = vbADD(V)
ElseIf sOp Like "Mult*" Or sOp Like "Prod*" Then
HiPrecMath = vbMULT(V)
ElseIf sOp Like "Div*" Then
HiPrecMath = vbDIV(V)
End If
End Function
Private Function vbADD(F) As String
Dim vRes As Variant
For I = 0 To UBound(F)
vRes = vRes + CDec(F(I))
Next I
vbADD = vRes
End Function
Private Function vbMULT(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes * CDec(F(I))
Next I
vbMULT = vRes
End Function
Private Function vbDIV(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes / CDec(F(I))
Next I
vbDIV = vRes
End Function
以下是使用您的数据的示例: