これが私が思いついた機能です:
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]