1,2 + 1,1 может быть в порядке, но 0,2 + 0,1 может быть не в порядке.
Это проблема практически для всех языков, которые используются сегодня.Проблема в том, что 1/10 не может быть точно представлена в виде двоичной дроби, точно так же как 1/3 не может быть представлена в виде десятичной дроби.
Обходные пути включают округление до нужного вам количества десятичных разрядов, а такжеработать со строками, которые являются точными:
(0.2 + 0.1).toFixed(4) === 0.3.toFixed(4) // true
или вы можете преобразовать их в числа после этого:
+(0.2 + 0.1).toFixed(4) === 0.3 // true
или используя Math.round:
Math.round(0.2 * X + 0.1 * X) / X === 0.3 // true
где X
- это некоторая степень 10, например 100 или 10000 - в зависимости от того, какая точность вам нужна.
Или вы можете использовать центы вместо долларов при подсчете денег:
cents = 1499; // $14.99
Тото, как вы работаете только с целыми числами, и вам не нужно беспокоиться о десятичных и двоичных дробях.
2017 Обновление
Ситуация представления чисел в JavaScript может быть немного сложнеечем раньше. раньше было то, что у нас был только один числовой тип в JavaScript:
Thisэто уже не случай - не только в настоящее время в JavaScript существует больше числовых типов, но еще больше, включая предложение добавить целые числа произвольной точности в ECMAScript, и, надеюсь, последуют десятичные числа произвольной точности - смотритеэтот ответ для деталей:
См. также
Другой соответствующий ответ с некоторымипримеры того, как обрабатывать вычисления: