Какую точность поддерживает Excel? Я попытался вычислить 0.800000000000001 / 2
и получил неправильный результат 0.40000000000000000000
, где он должен быть 0.4000000000000005
2 ответа
Excel поддерживает арифметику с плавающей точкой, которая имеет ограничение в 15 десятичных знаков. Вот расследование и ссылка.
При исследовании этого предмета было обнаружено, что только 15 цифр хранятся в арифметических количествах из-за предполагаемой записи с плавающей запятой.
После поиска этого подозреваемого виновника ссылка находится здесь:https://support.microsoft.com/en-us/kb/78113 и здесь https://support.microsoft.com/en-us/kb/214118.
Таким образом, 15 знаков после запятой - это максимальный перенос в плавающей запятой. Вот тот же пример в 14 десятичных разрядах. Обратите внимание на 5 в 14-м десятичном знаке; представляет дальнейшую демонстрацию пределов с плавающей точкой.
Чтобы проверить теорию, прокомментированную участником на этом форуме, я решил добавить это дополнение. Нет, даже в VBa переменная Double не может превышать ограничения с плавающей точкой. Я использовал двойную точность и возвратил значение как String, чтобы продемонстрировать здесь еще больше:
Исключение из правил!
Спасибо, Рон Розенфельд. Относительно последнего изображения, относительно VBa. Если вы используете код VBa, то использование VBa library function CDec()
действительно фиксирует точность, не охваченную пределами, как обсуждалось выше. Однако с одним предупреждением вы должны вернуть данные в виде строки для отображения. Ссылку можно найти здесь: http://www.techonthenet.com/excel/formulas/cdec.php
Вот пример того, как использовать тип данных VBA Decimal в простых математических операциях, чтобы получить более высокую точность, чем точность десятичных цифр в Excel.
Очевидно, вы можете расширить это, чтобы использовать для других типов операций. Однако, если 28 десятичной точности или допустимый диапазон чисел (см. Справку) недостаточен, вам понадобится другой инструмент.
Приведенный ниже пример предназначен только для сложения, умножения и деления. Но вы можете легко распространить его на другие операции или реализовать по-другому, в зависимости от того, что вам действительно нужно.
Обратите внимание, что результаты возвращаются в виде строки (текст). В противном случае Excel не сможет отображать результаты. Если вы используете его исключительно в VBA, вы можете вернуть результат в виде варианта / десятичного числа.
Function HiPrecMath(sOp As String, ParamArray Factors() As Variant) As String
Dim V As Variant
V = Factors
If sOp Like "Add*" Then
HiPrecMath = vbADD(V)
ElseIf sOp Like "Mult*" Or sOp Like "Prod*" Then
HiPrecMath = vbMULT(V)
ElseIf sOp Like "Div*" Then
HiPrecMath = vbDIV(V)
End If
End Function
Private Function vbADD(F) As String
Dim vRes As Variant
For I = 0 To UBound(F)
vRes = vRes + CDec(F(I))
Next I
vbADD = vRes
End Function
Private Function vbMULT(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes * CDec(F(I))
Next I
vbMULT = vRes
End Function
Private Function vbDIV(F) As String
Dim vRes As Variant
vRes = F(0)
For I = 1 To UBound(F)
vRes = vRes / CDec(F(I))
Next I
vbDIV = vRes
End Function
Вот пример использования ваших данных: