💰「銀行丸め」を知っているか?~JavaScript編~2021/08/05に公開2023/06/036件JavaScripttechDiscussionYutaUra2021/08/06補足ですが、こういった丸め処理のことを偶数丸め(偶数方向への丸めめ)などともいうそうです! つえ2021/08/06ありがとうございます! 追記しておきます! 返信を追加cisdur2021/08/07銀行丸めは誤差を小さくするのに役立ちますが、「1円がどうしても合わない!!!」ということが問題である場合、あまり本質的な解決にならないのではないでしょうか。 例として、「100円の商品が3つ」で「値引総額100円」の場合を考えてみてください。各商品の値引按分額は、通常の四捨五入でも銀行丸めでも33円ですので、値引き額の合計は99円になってしまいます。 返信を追加つえ2021/08/07ご指摘ありがとうございます。確かにその通りでした。 コードを見直したところ、「銀行丸め」をした上で最終的な差を、最後の商品のitemDiscountで調整していました。 なので、下記のようになるかと思います。 const totalDiscount = [] totalDiscount.push(会計データ.商品.map(v => { return v. itemDiscount })) if(totalDiscount !== ディスカウントすべき額) { 最後の商品(商品C)のitemDiscountに過不足(ディスカウントすべき額 - totalDiscount)を足す処理 } [ 商品A:{ price:100, itemDiscount:33, //按分した単品の値引額 }, 商品B:{ price:100, itemDiscount:33, //按分した単品の値引額 }, 商品C:{ price:100, itemDiscount:34, //按分した単品の値引額(別個で計算が必要) }, subTotal:300,//小計 discount:100,//クーポン値引額(ディスカウントすべき額) total:200,//最終支払額 ] みなさま、「銀行丸め」だけで解決できるわけではござまいせん! 返信を追加KageShiron2021/08/09文字列にして.indexOf('.5') !== -1 を見るということかと思いますが、銀行丸めだと.51の時は近い方に丸めるのではないでしょうか。 2.5→2 2.51→3 返信を追加つえ2021/08/09.5 じゃないものは 普通にmath.round() 四捨五入の処理で大丈夫です。 返信を追加
YutaUra2021/08/06補足ですが、こういった丸め処理のことを偶数丸め(偶数方向への丸めめ)などともいうそうです! つえ2021/08/06ありがとうございます! 追記しておきます! 返信を追加
cisdur2021/08/07銀行丸めは誤差を小さくするのに役立ちますが、「1円がどうしても合わない!!!」ということが問題である場合、あまり本質的な解決にならないのではないでしょうか。 例として、「100円の商品が3つ」で「値引総額100円」の場合を考えてみてください。各商品の値引按分額は、通常の四捨五入でも銀行丸めでも33円ですので、値引き額の合計は99円になってしまいます。 返信を追加
つえ2021/08/07ご指摘ありがとうございます。確かにその通りでした。 コードを見直したところ、「銀行丸め」をした上で最終的な差を、最後の商品のitemDiscountで調整していました。 なので、下記のようになるかと思います。 const totalDiscount = [] totalDiscount.push(会計データ.商品.map(v => { return v. itemDiscount })) if(totalDiscount !== ディスカウントすべき額) { 最後の商品(商品C)のitemDiscountに過不足(ディスカウントすべき額 - totalDiscount)を足す処理 } [ 商品A:{ price:100, itemDiscount:33, //按分した単品の値引額 }, 商品B:{ price:100, itemDiscount:33, //按分した単品の値引額 }, 商品C:{ price:100, itemDiscount:34, //按分した単品の値引額(別個で計算が必要) }, subTotal:300,//小計 discount:100,//クーポン値引額(ディスカウントすべき額) total:200,//最終支払額 ] みなさま、「銀行丸め」だけで解決できるわけではござまいせん! 返信を追加
KageShiron2021/08/09文字列にして.indexOf('.5') !== -1 を見るということかと思いますが、銀行丸めだと.51の時は近い方に丸めるのではないでしょうか。 2.5→2 2.51→3 返信を追加
Discussion
補足ですが、こういった丸め処理のことを偶数丸め(偶数方向への丸めめ)などともいうそうです!
ありがとうございます!
追記しておきます!
銀行丸めは誤差を小さくするのに役立ちますが、「1円がどうしても合わない!!!」ということが問題である場合、あまり本質的な解決にならないのではないでしょうか。
例として、「100円の商品が3つ」で「値引総額100円」の場合を考えてみてください。各商品の値引按分額は、通常の四捨五入でも銀行丸めでも33円ですので、値引き額の合計は99円になってしまいます。
ご指摘ありがとうございます。確かにその通りでした。
コードを見直したところ、「銀行丸め」をした上で最終的な差を、最後の商品のitemDiscountで調整していました。
なので、下記のようになるかと思います。
みなさま、「銀行丸め」だけで解決できるわけではござまいせん!
文字列にして
.indexOf('.5') !== -1を見るということかと思いますが、銀行丸めだと.51の時は近い方に丸めるのではないでしょうか。2.5→2
2.51→3
.5 じゃないものは 普通にmath.round() 四捨五入の処理で大丈夫です。