![在 Excel 工作表中使用十进制数据类型](https://linux22.com/image/1506731/%E5%9C%A8%20Excel%20%E5%B7%A5%E4%BD%9C%E8%A1%A8%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8D%81%E8%BF%9B%E5%88%B6%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B.png)
我正在寻找一种在 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 字节数字的有限空间中存储小数的方法。当然,对于大多数数字,必须进行某种近似。
似乎您试图保持比设计更高的精度。您可以通过将数字放大(例如 1x10^15 的倍数)来存储更多数字。它将为您存储额外的信息,但可能无法与您拥有的机器配合使用。