Функция Excel ROUND в Javascript - PullRequest
0 голосов
/ 29 января 2019

У меня есть математическая формула в Excel, которая выглядит следующим образом:

ROUND((B2+C2)*(B55/100)/12;2)

Исходные значения:

  • B2 = 1000
  • C2 =0
  • B55 = 0,03

Результаты (t означает время в месяцах).Values from excel

Вот мой подход к Javascript:

(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).toFixed(2));
    amount = Number((amount + interest + investment).toFixed(2));
  }
  console.log('Result: ', amount);
})();

Как видно, результат неверный.

Где найти алгоритм Microsoft Excel для ROUND ()?

1 Ответ

0 голосов
/ 29 января 2019

В 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, ссылка на Что должен знать каждый программистАрифметика с плавающей точкой может быть полезна.

...