2

適切な言葉がないため、金額 (ドル単位) を 1 つ以上の「バケツ」に分割する方法が必要でした。1 ドルあたりの標準的な小数点以下 2 桁の精度が必要でしたが、すべてのペニーを考慮する必要がありました。

問題を説明するために、次の例を検討してください。

200 ドルを 3 つの方法で分割します。切り捨てると、各金額は $66.66 になり、2 セント不足になりますが、切り上げると、各金額は $66.67 になり、2 セント多くなります。もちろん、答えは 1 つ 66.66 ドル、残りの 2 つを 66.67 ドルにすることです。人間が推論するのは簡単ですが、JavaScript にそれを理解させるのは、一種の挑戦です。

4

1 に答える 1

2

これが私が思いついた機能です:

function SplitTotal( totalAmount, numberToSplit, precision ) {
  var precisionFactor = Math.pow(10, precision);
  var remainderFactor = 1 / precisionFactor;

  var splitAmount = Math.ceil( totalAmount / numberToSplit * precisionFactor ) / precisionFactor;
  var remainder = Math.round( (splitAmount * numberToSplit - totalAmount) * precisionFactor ) / precisionFactor;

  var result = [];
  for (var i = 0; i < numberToSplit; i++) {
    result.push( (remainder >= remainderFactor) ?
                     Math.round( (splitAmount - remainderFactor) * precisionFactor ) / precisionFactor :
                     splitAmount );
    remainder = Math.round( (remainder - remainderFactor) * precisionFactor ) / precisionFactor;
  }
  return result;
}

JavaScript は浮動小数点数をひどく処理するため、コードは少し複雑です。適切で正確な小数の金額を取得するには、ここで「精度係数」と呼ばれるものを金額に掛ける必要があります。これは 10 の指数に過ぎず、結果の数値を四捨五入し、その精度係数で割ります。元の小数精度に戻ります。

小数点以下 2 桁の精度しか必要としませんでしたが、精度を簡単に定義できるようにしたので、金額だけのアプリケーションでも機能します。整数のみが必要な場合は、精度 0 を指定できます。

例: $235.38 を 7 通りに割ります:

> SplitTotal(235.38, 7, 2)

[33.62, 33.62, 33.62, 33.63, 33.63, 33.63, 33.63]
于 2013-09-19T18:49:45.640 に答える