:
もう一つの方法は、正確な近似値の扱いの違いを見るためには、合計何倍に小さな数を追加することです。次のストアドプロシージャを考えてみましょう.0001を変数に1,000回追加します。
CREATE PROCEDURE p()
BEGIN
DECLARE i INT DEFAULT 0;
DECLARE d DECIMAL(10,4) DEFAULT 0;
DECLARE f FLOAT DEFAULT 0;
WHILE i < 10000 DO
SET d = d + .0001;
SET f = f + .0001E0;
SET i = i + 1;
END WHILE;
SELECT d, f;
END;
dとfの両方の合計は論理的に1にする必要がありますが、これは小数点の計算にのみ適用されます。浮動小数点演算は、小さな誤差が導入されています
+--------+------------------+
| d | f |
+--------+------------------+
| 1.0000 | 0.99999999999991 |
+--------+------------------+
浮動小数点型を扱うときあなたが書くかについての問題が常に存在しています。確かに、MySQLに格納されている量がFLOAT
またはDOUBLE
の場合、この問題が発生しますが、これはちょうどDECIMAL
です。
DECIMAL
を使用している場合は、データベースで通常の比較を使用できます。 MySQLは誤った結果を返しません。
ただし、データベースからデータを取得し、プログラミング言語の変数に割り当てるときは注意が必要です。特に変数の動的型付けであるプログラミング言語の場合... integer
またはlong integer
で操作する値を100倍して操作する必要があります。また、特殊なライブラリを使用してカンマ...
私は、MySQLが10進数を比較するのに問題があるとは思わない。おそらくあなたのプログラミング言語で起こり、浮動小数点に変換する場合にのみ起こります。それをしないでください。利用可能なBigDecimalのようなものがない場合は、それを避けるために 'select price * 100'を考慮してください。 – Thilo
だから最終的に何を解決しましたか/ – e4c5