1

さて、私は奇妙な問題を抱えています。それは、選択で結果を取得し、それを2000、つまり0.0025 * 2000で乗算し、4.9999888419121または5になるはずのときに何かを与えるという奇妙な問題があります。問題があることを確認しました。これで、しかし私はまだ解決策があったかどうかを見つけていません。数学は基本的な計算関数のようなものだと思いました。なぜ乗算のような単純な要求で失敗するのでしょうか。

これに対する修正があるかどうかはわかりません。私は実際にそれを調査してきましたが、誰かがそれを知っていればそれはここにあると思います。

再度、感謝します

例:

SELECT (table.rate * 2000) as per_ton ...

私は+0.0000のトリックを試しましたが、すべて運がありませんでした

4

1 に答える 1

3

この問題はMySQLに固有のものではありません。これは、10進値の近似値を格納するIEEE浮動小数点表現の一般的な問題です。(IEEE浮動小数点型は正確な基数2表現を格納します。)

したがって、これは乗算演算の「失敗」ではありません。レート用に保存した値は、(明らかに).0025の10進値でした。この値はIEEE浮動小数点で正確に表すことができないため、格納されるのは可能な限り最も近い近似値です。その概算値に2000を掛けると、結果も概算値になり、表示のために10進数に変換されます。

「修正」は、浮動小数点型ではなくDECIMALデータ型を使用し、浮動小数点演算ではなく「10進数」演算を使用して乗算演算を実行することです。

You can attempt to have that approximation reversed, by converting it back to decimal of specified precision, before you do the multiplication:

SELECT (CAST(table.rate AS DECIMAL(18,4) * 2000) AS per_ton ...

Or, you can try using the ROUND() function to trim off the digits of precision you don't need, e.g.

SELECT ROUND((table.rate * 2000),4) AS per_ton ...

That will get the result rounded up to 5.0000

The real "fix" though, is to define your columns with DECIMAL datatype, and AVOID using floating point columns at all.

This behavior of floating point values is well documented, albeit, at the end of the manual:

http://dev.mysql.com/doc/refman/5.1/en/problems-with-float.html

于 2012-08-09T16:16:11.763 に答える