Добавьте числа от переменных в Google Apps Script, идущем странный

Добавляя числа, которые я осуществляю CSV, это - файл журнала, который я получаю:

var costs = Number(csvData[i][9].replace(",",".")); //need to replace , with . and    
total_costs_overeenkomst=total_costs_overeenkomst+costs;  //add variables
Logger.log("Kosten: "+costs);
Logger.log("Subtotaal:"+total_costs_overeenkomst);

Вот регистрация, подходит до 3-го, где я получаю странную погрешность округления:

Kosten:4.8
Subtotaal:4.8
Kosten:49.92
Subtotaal:54.72
Kosten:4.8
Subtotaal:59.519999999999996
Kosten:2.4
Subtotaal:61.919999999999995
Kosten:2.57
Subtotaal:64.49
Kosten:22.18
Subtotaal:86.66999999999999
Kosten:34.56
Subtotaal:121.22999999999999
Kosten:4.8
Subtotaal:126.02999999999999

Почему это происходит?

С наилучшими пожеланиями, Риель

0
добавлено отредактировано
Просмотры: 2
nl ja de

1 ответы

Арифметика с плавающей точкой подвержена погрешностям округления в JavaScript и сценарии приложений. Посмотрите Математические операции с плавающей точкой сломаны?. Вы также найдете очень полный обзор, включая решения, здесь, особенно раздел на Евро или центы.

Чтобы продемонстрировать, я изменил ваш код, чтобы переместить десятичную точку:

function calcCosts() {
  var csvData = ["4,8","49,92","4,8","2,4","2,57","22,18","34,56","4,8"];
  var total_costs_overeenkomst = 0;

  for (i in csvData) {
    var costs = Number(csvData[i].replace(",",".")); //need to replace , with . and    
    total_costs_overeenkomst=(100*total_costs_overeenkomst+100*costs)/100;  //add variables
    Logger.log("Kosten: "+costs);
    Logger.log("Subtotaal:"+total_costs_overeenkomst);
  }
} 

Вот регистрации от того - я думаю, что они похожи на вас, ожидал их к.

Kosten: 4.8
Subtotaal:4.8
Kosten: 49.92
Subtotaal:54.72
Kosten: 4.8
Subtotaal:59.52
Kosten: 2.4
Subtotaal:61.92
Kosten: 2.57
Subtotaal:64.49
Kosten: 22.18
Subtotaal:86.67
Kosten: 34.56
Subtotaal:121.23
Kosten: 4.8
Subtotaal:126.03

Некоторые люди защищают выполнять все денежные вычисления, используя целые числа, устранять погрешности округления. JavaScript и сценарий приложений не имеют целое число как тип, просто число . Можно все еще сделать вычисления в "центах" и оставить выражение "долларов"/"Евро" как функция показа.

1
добавлено