Числа с плавающей точкой - без арифметических операций c и ошибок точности - PullRequest
0 голосов
/ 22 февраля 2020

Могу ли я когда-нибудь столкнуться с ошибками точности с плавающей точкой, если я не выполняю арифметических операций c с плавающей точкой? Единственные операции, которые я выполняю с числами в моей программе, ограничены следующим:

  1. Получение чисел в виде строк из веб-службы и преобразование их в числа с плавающей запятой с использованием parseFloat()
  2. Сравнение полученных результатов плавает с использованием <= < == > >=

Пример:

const input = ['1000.69', '1001.04' /*, ... */]
const x = parseFloat(input[0])
const y = parseFloat(input[1])
console.log(x < y)
console.log(x > y)
console.log(x == y)

Что касается реализации parseFloat(), я использую последний Node.js.

Источником плавающих величин являются цены в долларах США в виде строк, всегда два знаков после запятой.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Пока источник ваших поплавков надежен, ваши чеки в безопасности, да. Я бы по-прежнему округлял их до приемлемого десятичного числа после разбора, просто чтобы быть на 100% безопасным.

Как показывают документы MDN в одном из их примеров

// these all return 3.14
parseFloat(3.14);
parseFloat('3.14');
parseFloat('  3.14  ');
parseFloat('314e-2');
parseFloat('0.0314E+2');
parseFloat('3.14some non-digit characters');
parseFloat({ toString: function() { return "3.14" } });

//and of course
parseFloat('3.140000000') === 3.14
1 голос
/ 22 февраля 2020

Операция parseFloat преобразует строку в числовое значение . Spe c говорит:

В этой спецификации фраза «Числовое значение для x», где x представляет точную вещественную математическую величину (которая может даже быть иррациональным числом, таким как π), означает Числовое значение выбирается следующим образом. Рассмотрим набор всех конечных значений типа Number с удаленным -0 и добавлением к нему двух дополнительных значений, которые нельзя представить в типе Number, а именно 2ℝ1024ℝ (что составляет + 1ℝ × 2ℝ53ℝ × 2ℝ971ℝ) и -2ℝ1024ℝ (что составляет -1ℝ × 2ℝ53ℝ × 2ℝ971ℝ). Выберите элемент этого набора, ближайший по значению к x.

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

6.1.6.1.13 Число :: равно (x, y)

Если x равен NaN, вернуть false.

Если y равен NaN, вернуть false.

Если x равен то же самое числовое значение , что и y, вернуть true.

Если x равно +0 и y равно -0, вернуть true.

Если x равно -0 и y равно +0, вернуть true.

Вернуть false.

упорная мина

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