sql >> データベース >  >> RDS >> Mysql

MySQL浮動小数点比較の問題

    以下の問題に気づきましたか?

    CREATE TABLE a (num float);
    
    INSERT INTO a VALUES (50.12);
    INSERT INTO a VALUES (34.57);
    INSERT INTO a VALUES (12.75);
    INSERT INTO a VALUES (11.22);
    INSERT INTO a VALUES (10.46);
    INSERT INTO a VALUES (9.35);
    INSERT INTO a VALUES (8.55);
    INSERT INTO a VALUES (7.23);
    INSERT INTO a VALUES (6.53);
    INSERT INTO a VALUES (5.15);
    INSERT INTO a VALUES (4.01);
    
    SELECT SUM(num) FROM a;
    +-----------------+
    | SUM(num)        |
    +-----------------+
    | 159.94000005722 | 
    +-----------------+
    

    追加の0.00000005722があります それらの行のいくつかの間に広がります。したがって、これらの値の一部は、初期化された値と比較するとfalseを返します。

    浮動小数点演算と比較の問題を回避するには、DECIMALを使用する必要があります データ型:

    ALTER TABLE a MODIFY num DECIMAL(6,2);
    
    SELECT SUM(num) FROM a;
    +----------+
    | SUM(num) |
    +----------+
    |   159.94 | 
    +----------+
    1 row in set (0.00 sec)
    


    1. SQLテーブル

    2. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信リンク障害

    3. JOINとLEFTJOINおよびWHERE条件のパフォーマンスの提案をより詳細に説明する

    4. APPLSYSPUBスキーマ