金額にはFloatまたはDecimalデータ型を使用する必要がありますか?
答えは簡単です。決して浮かない。 決して !
フロートはIEEE754に準拠しており、常にバイナリであり、新しい標準IEEE754Rで定義された10進形式のみでした。分数のバイナリ部分の多くは、正確な小数表現と等しくなることはありません。
任意の2進数はm/2^n
と書くことができます (m
、n
正の整数)、m/(2^n*5^n)
としての任意の10進数 。バイナリにはプライムfactor 5
がないため 、すべての2進数は小数で正確に表すことができますが、その逆はできません。
0.3 = 3/(2^1 * 5^1) = 0.3
0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]
1/4 1/8 1/16 1/32
したがって、指定された10進数よりも大きいまたは小さい数値になります。常に。
なぜそれが重要なのですか?丸め。
通常の丸めとは、0..4ダウン、5..9アップを意味します。つまり、します 結果が0.049999999999
のいずれかであるかどうかは関係ありません ....または0.0500000000
... 5セントを意味することはご存知かもしれませんが、コンピューターはそれを認識せず、0.4999
を丸めます。 ...ダウン(間違っている)および0.5000
...上(右)。
浮動小数点計算の結果には常に小さな誤差項が含まれていることを考えると、決定は純粋な運です。 2進数で10進数を四捨五入して処理したい場合は、絶望的です。
納得できませんか?あなたはあなたの口座システムですべてが完全に大丈夫だと主張しますか?資産と負債は等しいですか?次に、各エントリの指定されたフォーマット済みの数値をそれぞれ取得し、それらを解析して、独立した10進法で合計します!
それをフォーマットされた合計と比較してください。おっと、何か問題がありますね
その計算には、「10億分の1ペニー」が発生したことを記録できるように、非常に正確で忠実である必要がありました(OracleのFLOATを使用しました)。
このエラーには役立ちません。なぜなら、すべての人が自動的にコンピュータの合計が正しいと想定し、実際には誰も独立してチェックすることはないからです。