Excel VBA 四舍五入

Excel VBA rounding with doubles

我正在尝试使用与我的工作表中的单元格相关的双精度数进行非常准确的计算。在测试时,我编写了以下代码:

Sub MacroTest()

Dim opt As Worksheet
Set opt = Sheets("Optimisation")

Dim test As Double

test = CDec(opt.Cells(2, 10))

End Sub

在单元格 J2 中是十进制值 -£3,298.8599993... 但是在调试代码时很明显,测试替身仅选取 -3298.86 作为值。我不明白为什么会这样,因为我认为双打比这更准确。我读过的大多数帖子似乎都认为使用 CDec 应该可以解决这个问题,但是如图所示,这似乎对我不起作用。

注意 - J2 中的值是使用公式计算的,不确定这是否有任何区别。非常感谢任何帮助 - 谢谢。

在这种情况下,您应该使用 opt.Cells(2, 10).Value2Range.Value2 property:

The only difference between this property and the Value property is that the Value2 property doesn’t use the Currency and Date data types. You can return values formatted with these data types as floating-point numbers by using the Double data type.

所以默认值 .Value 将 return Currency 如果单元格格式为货币,而 .Value2 将 return Double .

我还不能评论,但你的代码有问题:

您正在对双精度数据类型使用 CDec 转换公式,此函数的结果再次放入双精度数据类型。所以你不会在这里获得任何准确性。

您确定要使用双数据类型,而您可以在VBA中使用小数数据类型吗?

在我的示例中,单元格 "A1" 包含十进制数 3298.859999。

Dim varDec As Variant
varDec = CDec(Range("A1").Value2)

Debug.Print "Value in A1 : " & Format(varDec, "0.0000000000000000000000")

在 VBA 中无法将变量直接转换为 Decimal 数据类型,但是 Variant 数据类型具有 Decimal 数据类型作为子类型。

亲自查看:调试时查看 VBE 中的 "Locals"-window。它将显示:

Expression : var
Value      : 3298.859999
Type       : Variant/Decimal

Background article on Excel numeric precision