3

テストデータセットを含む次の表があります。

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `desc` varchar(20) DEFAULT NULL,
  `amount` double DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

    insert into `test` (`id`, `desc`, `amount`) values('5',NULL,'847.3');
    insert into `test` (`id`, `desc`, `amount`) values('6',NULL,'-847');
    insert into `test` (`id`, `desc`, `amount`) values('7',NULL,'847.3');
    insert into `test` (`id`, `desc`, `amount`) values('8',NULL,'-847');
    insert into `test` (`id`, `desc`, `amount`) values('9',NULL,'847.4');

したがって、テーブルは次のようになります。

ここに画像の説明を入力

今私の問題は、私が使用するときです:

SELECT SUM(amount) FROM test; 

847.9999999999999期待されるのではなく、次の結果が得られます848

小数を丸めない理由はありますか?

アップデート:

私はこれをMySQL Server: 5.5.17(Windows)とMySQL Server: 5.5.20Centosでテストしました

4

1 に答える 1

7

これは、コンピュータによる浮動小数点数の表現方法に固有の問題です。基本的に、有限の桁数で記述できる 10 進数の値は、2 進数では表すことができません。

ほとんどの場合、少数の 10 進数しか表示されないため、このような概算は見過ごされます。しかし、これらの概算値を加算および乗算し始めると、エラーが顕著になるポイントまで累積されます。

DECIMALこれが、タイプが存在する理由です。これは基本的に、10 のべき乗で除算または乗算された整数として 10 進数値を表します。このような表現では、近似値は作成されません。

于 2013-05-15T12:19:03.533 に答える