(10 * 1.11 = 11.1) оценивается как ЛОЖЬ. Как это исправить? - PullRequest
1 голос
/ 18 октября 2019
a = 10
b = 1.11
c = 11.1
' (mathematically: 10*1.11=11.1)
debug.print a*b = c

Я получаю False (неверно) вместо True (правильно).
Я знаю, что эта неправильность возникает из-за двоичного метода подсчета, и поэтому мне приходится с этим жить.

Вопрос заключается в следующем: как лучше всего заставить его работать правильно?
Является ли следующее решение лучшим решением, которое мы должны использовать при сравнении чисел с десятичными? это надежно?

round(a*b,2) = round(c,2) 

1 Ответ

5 голосов
/ 18 октября 2019

Арифметика с плавающей запятой почти никогда не верна, когда задействовано .1. Причина в том, что .1 не может быть представлен как 1/2^n в пределах 16 цифр от n.

Это несколько чисел, с которыми не было бы проблем с плавающей запятой, потому что они могут быть представлены как 1/2^n:

  • 0.128 = 1/2 ^ 5
  • 0,5 = 1/2 ^ 1
  • 0,375 = 1/2 ^ 2 + 1/2 ^ 3

Таким образом, тип десятичный приходит, чтобы решить проблему. Это лучший способ:

Sub TestMe()

    Dim a, b, c 'declaring as Variant, as Decimal cannot be declared in VBA

    a = CDec(10)
    b = CDec(1.11)
    c = CDec(11.1)
    Debug.Print a * b = c

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...