在 Excel 工作表中使用十进制数据类型

在 Excel 工作表中使用十进制数据类型

我正在寻找一种在 Excel 工作表中使用 Decimal 数据类型的方法。我将路线信息存储为数字。路线可能包含 10 次移动到 50 个不同位置。这在 VBA 中使用十进制数据类型可以正常工作,但是一旦从 VBA 传递这些数字,我就无法让 Excel 接受它们。

似乎将数据类型默认为 Double,这对于我的应用程序来说不够准确。此外,数字的字符串表示形式也不够,因为我要退出工作表中的数字。


以下是我目前生成路线编号的方法:

'generate route# for each row
For i = intFirstRow To intLastRow
    'initiate route#
    decRoute = CDec(dblInitialRoute)
    For j = 1 To 7
        'only assign if labor
        If arrLabor(i, j, 1) <> 0 And arrLabor(i, j, 1) <> "" Then
            'some stations could lead to multiple machines
            If arrLabor(i, j, 2) = 1 Then
                sglRandom = Rnd()
                If sglRandom < 0.8 Then
                    intValue = 1
                Else
                    intValue = 3
                End If
                decRoute = decRoute + intValue * (50 ^ ((decRoute - Int(decRoute)) * 100)) - 0.01
            ElseIf arrLabor(i, j, 2) = 10 Then
                sglRandom = Rnd()
                intValue = Int((sglRandom * 1000) / (1000 / 20)) + 10
                Debug.Print intValue
                decRoute = decRoute + intValue * (50 ^ ((decRoute - Int(decRoute)) * 100)) - 0.01
            Else
                intValue = arrLabor(i, j, 2)
                decRoute = decRoute + intValue * (50 ^ ((decRoute - Int(decRoute)) * 100)) - 0.01
            End If
        End If
        'exception
        If arrLabor(i, j, 1) = "" And j = 2 Then
            intValue = 44
            decRoute = decRoute + intValue * (50 ^ ((decRoute - Int(decRoute)) * 100)) - 0.01
        End If
    Next
    'write route#
    Debug.Print CDec(Int(decRoute) + dblInitialRoute)
    wsActive.Cells(i, intRouteCol).Value = CDec(Int(decRoute) + dblInitialRoute)
Next

答案1

单元格数字类型为双精度浮点数能够容纳最多 15 位精度。

Excel 以不同的方式存储数字,因此您可能希望以不同的格式在工作表上显示它们。在正常情况下,Excel 将数值存储为“双精度浮点”数字,或简称为“双精度”。这些是 8 字节变量,可以存储精确到小数点后 15 位的数字。您可能在工作表上只显示两位小数,但基础值有完整的 15 位小数。

第二个问题源于这样一个事实:任何计算机都无法完全准确地存储大多数小数。一般来说,计算机使用 IEEE(电气和电子工程师协会)浮点数标准。此标准提供了一种在 8 字节数字的有限空间中存储小数的方法。当然,对于大多数数字,必须进行某种近似。

Excel 中的舍入和精度 - CPearson

似乎您试图保持比设计更高的精度。您可以通过将数字放大(例如 1x10^15 的倍数)来存储更多数字。它将为您存储额外的信息,但可能无法与您拥有的机器配合使用。

相关内容