Ошибки округления чисел с плавающей точкой — хорошо известное явление, которое существует практически в любом языке программирования. Для того чтобы понаблюдать его в JavaScript, выполните следующий код:
const sum = 0.1 + 0.2;
console.log(sum); // выведет 0.30000000000000004
Мы не можем избежать ошибки округления, но можем свести ее к минимуму. При работе с денежными суммами в определенной валюте (например, в долларах) можно умножать все значения на 100, чтобы не иметь дела с дробными величинами. Вместо того чтобы писать такой код:
const currentBalance = 5382.23;
const transactionAmount = 14.02;
const updatedBalance = currentBalance — transactionAmount;
// Теперь updatedBalance = 5368.209999999999
лучше использовать следующие переменные для денежных сумм:
const currentBalanceInCents = 538223;
const transactionAmountInCents = 1402;
const updatedBalanceInCents = currentBalanceInCents - transactionAmountInCents;
// Теперь updatedBalanceInCents = 536821
Этот прием решит проблему для тех операций, которые работают с целыми числами без потери точности, такими как сложение и вычитание количества центов. Но что будет, если понадобится вычислить налог или доход в процентах? Результатом этих операций в любом случае будут дробные значения. Придется делать то же самое, что делают в таких случаях предприятия и банки, — округлять значения сразу после транзакции:
const costInCents = 4899;
// Вычислить налог в 11 % и округлить результат
// до ближайшего целого числа центов
const costWithTax = Math.round(costInCents*1.11);