足りない 1 円
あなたが明細を合計し、相手の経理が明細を合計し、二つの合計が 1 円違う。誰も計算を間違えていません。原因は二つ — 丸める瞬間が違うことと、コンピュータが小数を保存する方法 — そしてどちらも避けられます。
お金は小数ではなく、最小単位の整数
コンピュータは 0.1 と 0.2 を、非常に近いけれど正確ではない二進小数として保存します。だから多くの言語で 0.1 + 0.2 は 0.3 になりません。一行では誰も気づきません。四十行と税額計算を通れば、誤差は積み上がって目に見える 1 円になります。アプリは金額を小数として持ちません。価格は入力された瞬間に**最小単位の整数**になり、計算はすべて整数で行われ、表示のときだけ戻されます。合計が「正しい」のと「たいてい正しい」のとの差はここにあります。
一箇所で、一度だけ丸める
二つ目の原因はもっと繊細です。単価 33.5 の品を 3 個、三行。先に各行を丸めれば 101 が三つで 303。先に足して一度だけ丸めれば 302。算術的にはどちらも誤りではなく、別の問いへの答えです。誤りなのは同じ書面で両方をやることです。表示用に行を丸めながら、合計は丸めていない値から取る。すると、見えている明細が見えている合計にならない請求書ができます。アプリは行ごとに一度丸め、丸めた行を足します。
値引きが 1 円を隠す場所
合計に対する率の値引きは、行にきれいには割り切れません。単価 333 の三行に 10 パーセントなら 99.9 — 一行あたり 0.3 円で、印字できません。各行の取り分を切り捨てれば合計から 1 円足りなくなり、切り上げれば 1 円多くなります。アプリは値引きを小計に対して計算し、行へ配分し、余りを一つの行に載せます。こうして値引き後の行の合計が値引き後の小計と正確に一致します。
補助単位のない通貨
すべての通貨が小数二桁を持つわけではありません。日本円には補助単位がなく、金額は整数の円で、丸める先の下位単位が存在しません。二桁を固定した仕組みは ¥1,250.00 のような価格を作り、これは円の書き方ではないうえ、存在しない単位の百分の一に丸めています。アプリは小数桁数を**通貨ごと**に保持します。
よくある質問
請求書と表計算が 1 円違うのはなぜ?
たいてい一方が各行を丸め、もう一方が合計だけを丸めているからです。どちらも筋は通りますが、一つの書面で混ぜてはいけません。
行ごとに丸めるべきですか、合計で丸めるべきですか?
行ごとに丸め、丸めた行を足してください。そうすれば印字された明細が印字された合計になります。
0.1 + 0.2 は本当に 0.3 ではないのですか?
二進浮動小数点では 0.30000000000000004 です。だからお金は最小単位の整数で扱います。
率の値引きで余りが出るのはなぜ?
合計の何パーセントかが行に整数で割り切れることは稀だからです。余りはどこか一行に載せるしかありません。
アプリは日本円をどう扱いますか?
小数桁ゼロの通貨として。金額は整数の円で、補助単位も小数の丸めもありません。
合計を手で直してはいけませんか?
いけません。明細の合計と一致しない合計は、確認する人が最初に気づくところです。丸めの規則を直してください。
合計がきちんと合う請求書を。 Invoice Maker は請求書・見積書・proforma・領収書をブラウザ内で作り、金額を整数の最小単位で計算するので税額行がずれません。PDF で書き出します。アップロードはありません。
ブラウザで請求書を作る