1

3列のテーブルがあります:

ソース / ターゲット / ウエイト

x / y / 0.2

x / y / 0.2

z / a / 0.5

「重さ」の欄は「浮き」と同じです。すべての重複をグループ化し、「重み」スコアを追加するために選択を実行しています。クエリは次のとおりです。

SELECT source, target, sum(weight) as weight2
FROM mytable
GROUP BY source, target

奇妙なことに、クエリを実行した後、「重み」セクションの 1 未満の値 (0.2 など) は 1 に丸められているようです。したがって、次の表を取得します。

ソース / ターゲット / ウエイト

x / y / 2

z / a / 1

スコアが 0.4 と 0.5 であるべきところ。私は何を間違っていますか?

4

1 に答える 1

3

I just ran this on my instance of MySQL 5.5.30:

mysql> create table mytable (source char(1), target char(1), weight float);

mysql> insert into mytable values 
    -> ('x','y',0.2),
    -> ('x','y',0.2),
    -> ('z','a',0.5);

mysql> SELECT source, target, sum(weight) as weight2
    -> FROM mytable
    -> GROUP BY source, target;
+--------+--------+--------------------+
| source | target | weight2            |
+--------+--------+--------------------+
| x      | y      | 0.4000000059604645 |
| z      | a      |                0.5 |
+--------+--------+--------------------+

MySQL does not do rounding up to 1 as you describe. All I can guess is that you rounded up the values as you inserted them. I would recommend double-checking the data without doing a SUM() or GROUP BY, to see what the values are.

You may notice that in my output above, the SUM on the first row is not exactly 0.4, but instead it's a floating-point value near 0.4. You should probably not use FLOAT if you are concerned about rounding errors.

Read What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg.
Or a shorter treatment of this issue in the MySQL manual: Problems with Floating-Point Values.

于 2013-05-11T19:11:06.273 に答える