Таинственная ошибка расчета при умножении на 100 - PullRequest
4 голосов
/ 26 июня 2011

Следующий скрипт содержит очень странную ошибку. Я хочу проверить, является ли значение положительным целым числом. Для этого я умножаю на 100, чтобы заключить значение в десятичное число. Если я проверяю 0.07, сценарий вычисляет не значение 7, а значение 7.00000001. Я мог бы округлить значение, но я хотел бы знать, почему значение рассчитывается таким образом.

<script type="text/javascript">

  var isPositiveInt = function(i) {
        i = i*100;  
      return ((i % 1) == 0 && i >= 0);
  }; 

</script>

<a href="#" onclick="alert(isPositiveInt('0.07')); return false;">Try it out!</a>

0,05, 0,06 и 0,08 отлично работает. Но что происходит с 0,07? Я был бы счастлив, если бы кто-то мог мне это объяснить.

Ответы [ 2 ]

5 голосов
/ 26 июня 2011

Это потому что javascript внутренне сводит все к двойному.В результате во всех вычислениях возникает шум из-за погрешности с плавающей запятой: Примеры погрешностей с плавающей запятой

Один из способов решения этой проблемы - просто округлить значение до ближайшего целогопромежуточные расчеты.

2 голосов
/ 26 июня 2011

Это называется числовая математика. Компьютеры работают не с действительными числами, а с их приближением, и это приближение приводит к ошибкам округления, таким как этот.

Для 0,05, 0,06 и 0,08 вам повезло, что они имеют точное представление с плавающей запятой на вашем ПК. Это не случай 0,07. Обратите внимание, что на другом ПК / в браузере результат может отличаться.

Подробнее см. В спецификации формата IEEE с плавающей запятой .

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