В Excel =0.3/12
оценивается как 0.025
.Таким образом, округляется до 2 десятичных знаков это 0.03
.
В JavaScript var result = 0.3/12;
приводит к 0.024999999999999998
.Что .toFixed(2)
равно 0.02
.
Внутренне Excel
также получает 0.024999999999999998
, как и все системы, использующие Стандарт IEEE для арифметики с плавающей точкой (IEEE 754) .Но у него есть дополнительное правило - брать максимум 15 цифр.Это 0.02499999999999
+ 0.000000000000009
, то есть 0.025
.
Так что мы не можем использовать .toFixed
в JavaScript
.Если мы используем другой метод округления в JavaScript
, это приводит к тому же результату, что и в Excel
.
См. Пример с использованием простых значений:
var result = 0.3/12;
console.log(result);
console.log(result.toFixed(2));
console.log(Math.floor((Math.pow(10, 2)*result)+0.5)*Math.pow(10, -2));
См. Пример использования вашего алгоритма:
(function _calculateRates() {
var singlePayment = parseInt(1000, 10),
amount = singlePayment,
monthlyPayment = parseInt(0, 10),
investTime = parseFloat(12),
rate_a = parseFloat(0.03),
rate_b = parseFloat(0.03),
investment = monthlyPayment,
interest = 0;
for (var month = 0; month < investTime; month += 1) {
investment = (month === 0) ? 0 : monthlyPayment;
interest = Number(((amount + investment) * (rate_a / 100) / 12));
interest = Math.floor((Math.pow(10, 2)*interest)+0.5)*Math.pow(10, -2);
amount = Number((amount + interest + investment));
amount = Math.floor((Math.pow(10, 2)*amount)+0.5)*Math.pow(10, -2);
}
console.log('Result: ', amount);
})();
Поскольку это связано с этим вопросом, особенно почему в JavaScript
var result = 0.3/12;
получается 0.024999999999999998
, ссылка на Что должен знать каждый программистАрифметика с плавающей точкой может быть полезна.