1

Какую точность поддерживает Excel? Я попытался вычислить 0.800000000000001 / 2 и получил неправильный результат 0.40000000000000000000 , где он должен быть 0.4000000000000005

2 ответа2

3

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

2

Вот пример того, как использовать тип данных 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

Вот пример использования ваших данных:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .