セント単位の四捨五入計算
計算結果
丸めた値
- セント
- 268
金額をセント単位に丸めるとは、小数点以下2桁に切り詰めることで、ちょうど半セントの金額は0から遠い側へ倒す、四捨五入の規則です。2.675は2.68に、0.005は0.01になります。単価に数量を掛けたり、税率を小計に掛けたりした結果は、ほとんど決してちょうどのセントに乗らないので、これはほぼすべての金額計算の最後の1手です。正しくやるのは見た目より難しい作業です。素直なやり方は100を掛けて整数に丸めてから戻しますが、それは人がいちばん気にする金額でちょうど失敗します。1.005に100を掛けると100.5ではなく100.49999999999999になるので、この数は1.00に切り下がり、最後の1セントが音もなく消えます。元の値を小数第2位まで印字するやり方も、同じ理由で同じ失敗をします。見ているのが同じ、少しだけ小さい数だからです。どちらの失敗も自分から名乗り出ません。出てくるのはごく普通に見える金額で、気づく方法は、答えが何であるべきかを先に知っていることだけです。このページは掛け算ではなく小数点を文字として動かすことで罠を避けるので、丸めの判断は正確な値の上で行われます。金額を整数のセントでも返します。これから先も計算を続けるなら、残しておく価値があるのはその形です。結果は、読んでいる言語がお金を書くように書かれます。日本語と英語はセントの前に点を置いて千位をコンマで区切るので、1,234.57はそのまま1,234.57です。ドイツ語の読者には同じ金額が1.234,57と見えます。最後の1セントだけが違う2つの金額は、違う数として返ってきます。そこが要点です。
普通に見えて逆に丸まる4つの金額
| 金額 | 丸めた値 | セント |
|---|---|---|
| 2.675 | 2.68 | 268 |
| 1.005 | 1.01 | 101 |
| 0.005 | 0.01 | 1 |
| -0.005 | -0.01 | -1 |
ここに並ぶのは、素直な実装が間違える金額ばかりで、しかも失敗の理由はそれぞれ違います。2.675は誰もが使う例で、100を掛けるのがたまたまうまくいく唯一の場合でもあります。ちょうど267.5に乗るからです。つまり悪い見本にして良い警告です。この行だけを確かめた読者は、自分のコードも一致しているのを見て、直すところはないと結論してしまいます。本当の失敗は1.005のほうです。100分の1は二進数で正確に表せないので、100を掛けると100.49999999999999になり、素直なやり方はどちらも1.00と答えます。0.005はちょうど半セントで、0から遠い側へ動きます。正の金額では上へ動くのと同じことです。そして−0.005は同じ金額に符号を付けたもので、ここで2つの規則が別れます。負の半分を正の無限大へ丸めると負のゼロになり、−0.00と印字されます。3列目が並んでいるのは、各行が1つの金額の2つの見方を示すためでもあります。左が小数、右が整数のセントで、丸めた金額のほうから計算するので、この2つが食い違うことはありません。
公式
2.675 → 2.68、1.005 → 1.01、0.005 → 0.01、−0.005 → −0.01、セント = 丸めた値 × 100
- 値
- 丸める金額で、−10億から10億までです。小数第2位より下もわざと受け付けます。1.005や2.675こそこのページの対象で、それらを拒む入力は、存在理由である事例を追い返すことになるからです。入力欄は小数第2位までを強制しませんし、するべきでもありません。主題は丸めの規則であって入力の書式ではないからです。
- 丸めた値
- 小数第2位まで丸めたあとの金額で、結果の1行目です。文字ではなく数なので、読んでいる言語の小数点と千位の区切りで書かれます。日本語と英語では1,234.57、ドイツ語では1.234,57です。一般的な四捨五入のページとのこの違いは意図的で、同じ入力で違うのはそこだけです。
- セント
- 同じ金額を整数のセントで表したもので、1つ目の値を書き直したものではなく独立した出力です。268は足したり分けたり数えたりできる整数ですが、2.68は何かを掛けた瞬間に浮動小数点数に戻る小数です。元の金額ではなく丸めたあとの金額から計算するので、2つの行が食い違うことはありません。1.005は1.01と101の組になり、1.01と100の組には決してなりません。
- 0から遠い側へ
- ちょうど半セントに乗る金額の規則で、0.005は0.01へ、−0.005は−0.01へ動きます。上へ丸めるやり方と0から遠い側へ丸めるやり方は正の金額では一致し、負の金額で食い違います。素直な整数のやり方がここで負のゼロを返すので、区別が効いてきます。−0.00は、誰かに請求額として見せるものではありません。
- 1.005 × 100 = 100.49999999999999
- このページが建てられている失敗そのものです。100分の1は二進の浮動小数点では正確に表せないので、100を掛けた値はちょうど真ん中をわずかに下回り、丸めが逆へ行きます。先に掛け算をするやり方は、そのあと数を丸めても小数第2位に整えても、この誤差を受け継いで1.00と答えます。代わりに文字として小数点を動かせば値は正確なままで、答えは1.01になります。
- −0.005 → −0.01
- 負の半セントで、2つの丸め規則が別れる場合です。金額は0のちょうど半セント下にあり、規則は上へではなく0から遠い側へ動かすので、−0.00ではなく−0.01になります。負の半分を正の無限大へ丸めると負のゼロになり、−0.00と印字されます。計算自体は筋が通っていても、読む側には丸めの誤りに見えます。
お金で終わる計算はすべてここで終わります。勘定を何人かで分けるとめったにちょうどのセントに割り切れず、余りは誰かに寄せるか捨てるかしなければなりません。小計に税やチップの率を掛ければ、お金が持つより多い小数が生まれますし、単価に数量を掛けても同じです。最後に丸めるのは当たり前の手順ですが、それ以上に効くのは途中で丸めることです。分割払いの予定表は各期の残高から利息を計算し、その期の利息をセントに丸めてから残高に戻します。最後に1回だけ丸めると端数が積もっていき、360期ぶんではそれが数単位の金額になって、最後の残高が貸し手の数字と合わなくなるからです。同じ理屈は、合計を丸めた部品から組み立てるところすべてに当てはまります。先に部品を丸めてから足すのであって、その逆ではありません。そういう作業のために残しておくべき形がセントの数で、整数なので最後まで正確なままでいます。問いがお金ではなく一般の小数位数である場合、たとえば測定値を小数第3位まで、ある数値を有効数字2桁まで、という話であれば、四捨五入のページが13通りの対象を1か所で扱っています。このページが扱うのはお金が使うその1つだけで、しかも算術が間違えようのない規則で行います。
計算例
既定の金額:2.675
- 金額は2.67と2.68の間にあり、ちょうどその真ん中に位置します
- 半分は0から遠い側へ倒すので、答えは2.67ではなく2.68です
- 丸めた金額に100を掛けます。2.68 × 100 = 268
- セントで数えると268セントです
誰もがまず手に取る例で、既定がこれなのもそのためです。それと同時に、素直なやり方がたまたま正しい答えを出す唯一の場合でもあります。2.675に100を掛けると二進数ではちょうど267.5に乗るのに、1.005はそうならないからです。だからこの金額だけがページに載っていたら、自分のコードと突き合わせた読者は両者が一致しているのを見て、直すべき問題はないと結論してしまいます。違いを見せてくれるのは次の例で、画面でこの金額を先に出し、もう一方を下に置いているのはそのためです。
全員が引っかかる金額:1.005
- 金額は1.00と1.01のちょうど真ん中に位置します
- 半分は0から遠い側へ倒すので、答えは1.01です
- 100を掛けると100.5ではなく100.49999999999999になります。100分の1は二進数で正確に表せないからです
- つまり先に掛け算をするやり方は切り下げて1.00と答え、1セントを失います
- 小数点を文字として動かせば値は正確なままなので、出てくるのは1.01です
このページが存在する理由そのものの例です。100を掛けると100.49999999999999になります。これは偶然に少しだけ真ん中を下回ったのではなく、1.005が二進数で正確に表せず、格納される値が本当の値よりわずかに小さいからです。素直なやり方はどちらもその誤差を受け継ぎます。掛けた数を丸めても1.00、値を小数第2位に整えても1.00です。見ているのが同じ、少しだけ小さい数だからです。出力のどこも間違って見えません。1セントがただ消えており、それを見つける方法は、答えが何であるべきかを知っていることだけです。この種の半セントの金額こそ、金額計算が落ち着く先です。端数のある価格に率を掛ければ、いくらでも出てきます。
小数が多すぎるだけの普通の金額:1,234.5678
- 小数第1位と第2位は56で、そのあとに78が続きます。半セントより大きい値です
- なので小数第2位が上がります。1,234.57
- 100を掛けます。1,234.57 × 100 = 123,457
- 書き下すと、この金額は123,457セントです
何も起こらない例です。ページが罠ばかりにならないよう、1つ入れてあります。難しいことは何も起きません。小数第3位が7なので、金額は普通に切り上がり、2つのやり方は一致します。この例が示しているのは書き方のほうで、それは読者が最初に気づく違いです。日本語と英語では1,234.57と返り、千位をコンマで区切り、セントの前に点が来ます。ドイツ語では同じ数字が1.234,57と、2つの記号が入れ替わって返ります。フランス語ではコンマだったところに空白が入り、「1 234,57」のようになります。数字そのものは同じで、ページは数字に触っていません。変わるのはあなたの言語がお金をどう書くかで、このページはそれに従います。一方、一般的な四捨五入のページはわざと従いません。
0をわずかに下回る半セント:−0.005
- 金額は0とマイナス1セントのちょうど真ん中に位置します
- 半分は0から遠い側へ倒れます。ここでは下向きで、−0.01です
- 100を掛けるとちょうど−0.5になるので、これだけは素直に掛かります
- −0.5を素直に整数へ丸めると負のゼロになり、−0.00と印字されます
- 小数点を文字として動かすと−1セントになり、金額としては−0.01です
2つの丸め規則を分ける例です。正の金額では、半分を上へ丸めるやり方と0から遠い側へ丸めるやり方は一致するので、区別は重箱の隅に見えます。ここで分かれます。−0.5を上へ丸めると符号の付いたゼロになり、マイナス0セントの金額など誰に見せるべきものでもありません。この値も素直に掛かります。−0.005に100を掛けるとちょうど−0.5で、二進数の失敗は符号について対称ではないからです。テストする金額の組には、正の数だけでなく負の数も要るということでもあります。返金や与信、金額を超える割引は、すべてここにたどり着きます。
適用限界
金額は−10億から10億までの数でなければならず、丸めた結果はその範囲を1段だけはみ出ることがあります。999999999.999はちょうど10億に切り上がり、そのときセントの出力は1,000億になります。その大きさでも出力が正確なのは、それだけ大きな整数のセントが、整数が正確に表される範囲にまだ収まっているからです。丸めの規則は0から遠い側へで、切り替える設定はありません。規則の切り替えがあるページは、あなたの国の裁判所がどちらの規則を使うかを説明しなければならなくなるからです。負の金額は上へではなく0から遠い側へ丸められ、両者が違うのはちょうど半セントの場合だけです。このページは通貨を持ちません。金額が何セントになるかは知っていますが、そのセントが何と呼ばれるかは知らないので、出力は数であり、記号を足すのはあなたの側です。丸めるのは1回に1つの金額で、合計を人数で分けたり、端数を割り当てたり、予定表の残高を合わせたりはしません。下の参考表は4つの固定した金額を出すだけで、あなたの入力には追随しません。表の中の数は現地化されずに印字されるので、上の結果パネルが現地化するのに、表ではどの言語でも2.675や−0.005と読めます。
よくある質問
- 1.005はなぜ1.00ではなく1.01に丸められるのですか
- 1.00と1.01のちょうど真ん中にあり、半分は0から遠い側へ倒す規則だからです。意外に見えるのは、素直な実装が1.00を返すからにすぎません。1.005に100を掛けると100.5ではなく100.49999999999999になります。100分の1は二進数で正確に表せず、格納される値が本当の値よりわずかに小さいからです。なので先に掛け算をするやり方は、そのあと数を丸めても小数第2位に整えても、真ん中をわずかに下回る値を見ていることになり、切り下がります。セントは大きな音を立てて消えるわけではなく、出てくるのは普通に見える金額です。この1つの入力があるから、ここは1行の式ではなくページになっています。
- 半分は上へ丸めますか、それとも偶数に丸めますか
- 0から遠い側へです。正の金額では上へ、負の金額では下へ丸めます。現金を扱う仕組みはほぼすべてそうしていますし、人が値段を丸めると言うときの意味もこれです。2.5セントは3に、−2.5セントは−3になります。もう1つよくある規則は半分を偶数に丸めるもので、長い列を足し上げたときに上へ偏り続けるのを防ぐためにあります。統計や会計の一部では重要ですが、このページがやっていることではありません。2つの規則はちょうど半分の場合を除いて一致するので、違いはなかなか気づかれません。支払いがちょうど半分に乗ったときに初めて表に出ます。切り替えはありません。切り替えがあれば、どちらの規則がどの国の話なのかを説明しなければならなくなるからです。
- なぜ金額と一緒にセントの数も出すのですか
- 2つは別の用途に使い道があり、正確なままでいられるのは整数のほうだからです。268は整数なので、ほかのセントに足しても、人数で分けても、数量を掛けても、何も起こらずにそのまま使えます。2.68は小数で、何かを掛けた瞬間に、ここで避けたかったのと同じ表現の問題を抱えた浮動小数点数に戻ります。セントを元の入力ではなく丸めたあとの金額から計算しているのも同じ理由です。別々に計算すると、1.005のような入力で片方の行に1.01、次の行に100と印字されかねません。同じパネルの2つの数が食い違うのは、どちらかが少しずれているより悪いことです。
- なぜ言語によっては結果にコンマが入るのですか
- お金は読んでいる言語が書くように書かれるもので、それはどこでも同じではないからです。日本語と英語はセントの前に点を置き、千位をコンマで区切るので、金額は1,234.57と出ます。ドイツ語と大陸ヨーロッパのほとんどは2つが入れ替わり、1.234,57になります。フランス語はコンマだったところに空白を入れて「1 234,57」と書きます。このページは金額を文字ではなく数として返すので、書式は読んでいる言語に従います。このサイトの一般的な四捨五入のページはわざとそうしていません。あちらの結果は文字で、小数点は固定、千位の区切りもありません。同じ入力で2つのページが本当に違うのはそこだけです。
- セントへの丸めは実際どこで効いてくるのですか
- 合計を部品から組み立てるところすべてです。いちばん分かりやすいのは分割払いの予定表です。各期の利息は残高から計算し、セントに丸めてから残高に戻します。丸めるのを最後の1回だけにすると端数が積もっていき、360期ぶんではそれが数単位の金額になって、最後の残高が貸し手の数字と合わなくなります。勘定を分けるのも同じ形です。合計を何人かで分けるとめったにちょうどのセントにならず、はみ出した1セントはどこかへ行かなければなりません。金額に率を掛けるもの、つまり税、チップ、割引はどれも、お金が持つより多い小数を生みます。持ち帰るべき規則は、先に部品を丸めてから丸めた部品を足す、ということです。逆ではありません。
- このページが受け付けるいちばん大きな金額はいくらですか
- プラスでもマイナスでも10億までで、丸めた答えはその範囲を1段だけはみ出すことがあります。999999999.999はちょうど10億に切り上がり、そのときセントの出力は1,000億になります。その大きさでも出力が正確なのは、それだけ大きな整数のセントが、すべての整数が正確に表される範囲にまだ収まっているからです。上限は、整数が近似され始める点よりずっと手前にあります。範囲を超えた入力は丸め込まずに断ります。自分が入れていない金額を黙って丸めるのは、断るより悪い答えだからです。
参考文献
- Rounding — 0から遠い側へ丸める規則と、負の値で半分を上へ丸めるやり方との違い — Wolfram MathWorld (United States)
- What Every Computer Scientist Should Know About Floating-Point Arithmetic — 1.005を倍精度数として格納すると、ちょうど半分よりわずかに小さくなる理由 — Oracle (originally ACM Computing Surveys)
- Number.prototype.toFixed — 半分を偶数に丸める挙動と、値を小数第2位に整えることが丸めることと同じではない理由 — MDN Web Docs (Mozilla)
- 学習指導要領(平成29・30・31年改訂) — 小学校の「数と計算」領域で扱う小数の意味と四捨五入、および概数の根拠になる文部科学省の告示・解説 — 文部科学省