こんにちは。
現場で金額を計算する際の奇妙さに気づきました。
値の表:
タイプ フィールド - フロート。
私は合計を選択します:
SELECT SUM(cost) as cost FROM Table
結果として、私はsum
= 20.47497010231018;を取得します。
私は電卓を使用します)、私は得ますsum
= 20,47497
なぜ異なる結果が得られるのか教えてください。
これらの種類の違いは、ほとんどの状況で心配するのに十分ではありません。
浮動小数点数は、ビット数と浮動小数点数が2進数で格納される方法のために、意図した値からわずかに外れていることで有名です。たとえば、ここに示されているように、の10進値の0.1
実際のdouble
値は0.10000000149011612
。です。閉じますが、正確ではありません。
絶対的に正確な緯度と経度の数値を必要とする一部のアプリケーションで使用されているのを見た手法は、浮動小数点数に10の累乗を掛けたものに相当する整数データ型の値を保持することです。Android上のGoogleMapsAPI v1は、マイクロ度で測定されます。値を正確に保持するような緯度と経度の代わりに、54.123428, 60.809234
それらはintになります54123428, 60809234
。これを表現するために、彼らは変数latitudeE6
を呼び出し、longitudeE6
それが実際の緯度または経度に1E6(10 ^ 6の科学的記数法)を掛けたものであることを示します。
DECIMAL(16, 4)
たとえば、通貨の列に type を使用します4
。.
10
ただし、たとえばが表示されるため、末尾のゼロを削除する必要があります10.0000
。ただし、これは簡単に実行できます。
ここで、これを読んでください:http://floating-point-gui.de/
したがって、問題は、浮動小数点数 (ハードウェアの 10 進数の内部実装であり、ほとんどの言語やアプリケーションで使用される) が、1 対 1 を基数 10 の数値にマップしないことです。基礎となる値は基数 2 で表され、精度には制限があります。10 進数表記では数桁で表現できる数値でも、ネイティブ形式では実際にはもっと多くの桁数が必要になる場合があり、丸め誤差につながります。
上記のリンク先の記事で詳しく説明されています。