Excel VBA округление с двойными

Я пытаюсь сделать очень точный расчет, используя двойные числа, которые относятся к ячейкам в моей рабочей таблице. В процессе тестирования я написал следующий код:

Sub MacroTest()

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

Dim test As Double

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

End Sub

В ячейке J2 находится десятичное значение -3298,8599993... однако при отладке кода становится ясно, что тестовый двойник только принимает значение -3298,86 в качестве значения. Я не понимаю, почему это так, поскольку я думал, что удвоения были более точными, чем это. Большинство постов, которые я прочитал, похоже, считают, что использование CDec должно решить эту проблему, однако, как показано, это не работает для меня.

Примечание. Значение в J2 рассчитывается по формуле, но не уверен, что это имеет значение. Любая помощь с благодарностью - спасибо.

2 ответа

Решение

Вы должны использовать opt.Cells(2, 10).Value2 в этом случае. Range.Value2 свойство:

Единственное различие между этим свойством и свойством Value заключается в том, что свойство Value2 не использует типы данных Currency и Date. Вы можете вернуть значения, отформатированные с этими типами данных, как числа с плавающей запятой, используя тип данных Double.

Так что по умолчанию .Value вернусь Currency если ячейка отформатирована как валюта .Value2 вернет Double тем не менее.

Я пока не могу комментировать, но вот что не так с вашим кодом:

Вы используете формулу преобразования CDec для двойного типа данных, и результат этой функции снова помещается в двойной тип данных. Таким образом, вы ничего не получаете здесь с точки зрения точности.

Вы уверены, что хотите использовать двойной тип данных, в то время как вы могли бы использовать десятичный тип данных в VBA?

В моем примере ячейка "A1" содержит десятичное число 3298.859999.

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

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

Прямое приведение переменной к типу Decimal-datatype невозможно в VBA, но тип Variant-datatype имеет тип Decimal-datatype в качестве подтипа.

Чтобы убедиться в этом: во время отладки посмотрите в окне "Locals" в VBE. Это покажет:

Expression : var
Value      : 3298.859999
Type       : Variant/Decimal

Фоновая статья о точности чисел в Excel

Другие вопросы по тегам