Excel VBA四舍五入与双打

时间:2016-07-21 11:41:50

标签: excel excel-vba floating-point double rounding-error vba

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

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中的值是使用公式计算的,不确定这是否有任何区别。非常感谢任何帮助 - 谢谢。

2 个答案:

答案 0 :(得分:3)

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

  

此属性与Value属性之间的唯一区别是   Value2属性不使用Currency和Date数据类型。   您可以返回使用这些数据类型格式化的值   使用Double数据类型的浮点数。

因此,如果单元格格式为货币,则默认.Value将返回Currency,而.Value2将返回Double

答案 1 :(得分:0)

我暂时无法发表评论,但是您的代码出现了问题:

您正在使用双数据类型的CDec转换公式,并且此函数的结果将再次置于双数据类型中。所以你在这里没有获得任何准确性。

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

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

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

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

在VBA中无法将变量直接转换为Decimal-datatype,但Variant-datatype将Decimal-datatype作为子类型。

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

Expression : var
Value      : 3298.859999
Type       : Variant/Decimal

Background article on Excel numeric precision

相关问题