ブログ
Boring Expenses がお金を整数で保存する理由
1 円をなくす定番の方法があります。ほとんどのプログラミング言語に 0.1 + 0.2 を計算させると、0.30000000000000004 と返ってきます。これは言語のバグではなく、2 進数の浮動小数点数の仕組みです。ほとんどの 10 進数の小数を正確に表せないので、小さな誤差が入り込みます。物理計算なら問題ありませんが、お金ではそうはいきません。
家計アプリにとって「だいたい合っている」は不正解です。だから Boring Expenses は、金額を小数として保存することは一切ありません。
最小単位を整数で保存する
お金を扱うソフトウェアが昔から使ってきた方法は、最小単位で計算し、それを整数のまま保つことです。$4.20 ではなく、セントの数である 420 を保存します。整数は正確です。一日中足し引きして合計しても、丸め誤差のちりが積もることはありません。
Boring Expenses はさらに一歩進めて、金額をとても細かい単位(「1 単位あたり 1 億」のようなもの)で保存しています。これにより、さまざまな通貨や将来の必要に十分な余裕を残しながら、すべてを普通の Int のままにしておけます。画面に表示される値との変換は、いちばん端、つまり金額を入力したときと表示用に整形するときにだけ行います。
// 説明用のコードで、実際のコードそのものではありません:
let display = Decimal(amountInSubunits) / Decimal(subunitsPerUnit)
let text = display.formatted(.currency(code: userCurrency))
これがあなたにとって大切な理由
- 合計が正確です。 月の合計は本当の合計であり、リストが長くなるにつれて 1 円ずつずれていく数字ではありません。
- 同期がぶれません。 整数は iPhone でも Apple Watch でも iPad でも同じ意味を持ちます。食い違いが生まれる余地がありません。
- 書き出しが信頼できます。 書き出した CSV は、アプリの表示と 1 円単位で一致します。
小さくて地味な決断です。私たちが好きな種類の。あなたが目にすることはありませんが、それでいいのです。数字がきちんと合う、ただそれだけのことです。