Почему сумма из двух переменных parseFloat дает мне неправильное десятичное число

Если у меня есть эта небольшая функция:

<script type="text/javascript">

 function printFloat(){
      var myFloatNumber1 = document.getElementById('floatNumber1');
      var myFloatNumber2 = document.getElementById('floatNumber2');
      alert(parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value))
 }

</script>

<input type="text" id="floatNumber1"></input>
<input type="text" id="floatNumber2"></input>

<input type="button" onclick="printFloat()"/>

в поле 1 Я вхожу: 221.58 в поле 2 я вхожу: 2497.74

Я ожидаю, что сумма 2 чисел в полях ввода будет 2-значной цифрой: 2719.32 Но результатом является неправильное число...: 2719.3199999999997

раунд выполнит эту работу, но я просто не понимаю, почему код делает это на этом номере... В других комбинациях чисел сумма правильная...

Ответ 1

От Руководство по плавающей запятой:

Почему не мои цифры, например, 0,1 + 0,2, составляют хороший раунд 0,3 и вместо этого я получаю странный результат вроде 0,30000000000000004?

Поскольку внутренне компьютеры используют формат (двоичный с плавающей запятой), который не может точно представлять число например 0,1, 0,2 или 0,3.

Когда код скомпилирован или интерпретируется, ваш "0,1" уже округленное до ближайшего формате, что приводит к небольшому ошибки округления еще до происходит расчет.

В вашем случае ошибки округления происходят, когда введенные значения преобразуются с помощью parseFloat().

Почему другие вычисления, такие как 0.1 + 0.4, работают правильно?

В этом случае результатом (0.5) может быть как точно число с плавающей запятой и возможны ошибки округления в номера ввода для отмены друг друга - Но на эту возможность нельзя полагаться (например, когда эти два числа были хранятся в плавающих первых, ошибки округления могут не другой).

В других случаях, таких как 0,1 + 0,3, результат на самом деле не совсем 0,4, но достаточно близко, чтобы 0,4 был самым коротким число, которое ближе к результату чем к любой другой плавающей точке номер. Затем отображаются многие языки это число вместо преобразования фактический результат вернуться к ближайшему десятичная дробь.

Ответ 3

просто выполните следующие действия.

function printFloat(){
      var myFloatNumber1 = document.getElementById('floatNumber1');
      var myFloatNumber2 = document.getElementById('floatNumber2');
      var total=parseFloat(myFloatNumber1.value) + parseFloat(myFloatNumber2.value);
      alert(total.toFixed(2));
 }