Excel 支持什么小数精度?

Excel 支持什么小数精度?

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

以下是使用您的数据的示例:

在此处输入图片描述

相关内容