Десятичные дроби не точны

Если я сделаю 0,3 - 0,2, он даст 0,9999999998, а не 0,1, есть ли способ заставить его давать точное десятичное число? Не могу доверять калькулятору, если он не точен.


person Mrmajik45    schedule 23.08.2018    source источник
comment
Посмотрите числа с плавающей запятой, операции и точность. Взгляните на это: stackoverflow.com/questions/1458633/   -  person Chris Cousins    schedule 23.08.2018
comment
console.log ((a * 10-b * 10) / 10);   -  person sumit    schedule 23.08.2018


Ответы (2)


Вы можете попробовать это решение: https://30secondsofinterviews.org/#what-does-0-1-0-2-0-3-evaluate-to-

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

const approxEqual = (n1, n2, epsilon = 0.0001) => Math.abs(n1 - n2) < epsilon
approxEqual(0.1 + 0.2, 0.3) // true
person arkhi    schedule 23.08.2018
comment
какую строку мне заменить? И будет ли это работать со всеми десятичными знаками, кроме случайных чисел, таких как Пи? Извините, мой друг переписал код, и я не знаю, где все находится. - person Mrmajik45; 23.08.2018
comment
На самом деле, на основании предыдущего комментария sunnit, вы можете сделать это: const substract = (n1, n2, epsilon = 10) => ( n1 * Math.pow(10, epsilon) - n2 * Math.pow(10, epsilon) ) / Math.pow(10, epsilon);, затем substract(0.3, 0.2) - person arkhi; 23.08.2018

Вот очень быстрый ответ, который суммирует все флаги, насколько я могу:

Используйте для стандартной математики:

(.3-.2).toFixed(10); //10 can be changed to whatever you like for your string

Если вам нужно больше математических вычислений, чем это сделать:

Number((.3-.2).toFixed(10));

Последний даст вам именно то, что вы ожидали от числового типа.

person David Kamer    schedule 23.08.2018