0

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

なぜこうなった?

よろしく、リエル

4

1 に答える 1

1

浮動小数点演算は、javascript および apps-script で丸め誤差を起こしやすい傾向があります。浮動小数点演算は壊れていますか?を参照してください。. また、ソリューションを含む非常に完全な概要を見つけることができます。ここでは、特にユーロまたはセントのセクションを参照してください。

実証するために、小数点をシフトするようにコードを変更しました。

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

一部の人々は、丸め誤差を排除するために、整数を使用してすべての通貨計算を実行することを提唱しています。integerJavascript と apps-script はタイプとして持っていませんnumber。「セント」で計算を行うことができ、表示関数として「ドル」/「ユーロ」の表現を残すことができます。

于 2013-01-30T11:49:43.113 に答える