2012-04-10 5 views
0

sind insgesamt mySQL Neuling, aber ich habe keine Ahnung, wie die Antwort auf diese Frage zu finden, ist also, warum ich hier bin die:mySQL gibt leer zurück, obwohl es nicht sollte?

  DESCRIBE rParam; 
      +----------------+---------------+------+-----+---------+-------+ 
      | Field   | Type   | Null | Key | Default | Extra | 
      +----------------+---------------+------+-----+---------+-------+ 
      | p    | float   | YES |  | NULL |  | 
      | d    | float   | YES |  | NULL |  | 
      | LTP   | float   | YES |  | NULL |  | 
      | LTD   | float   | YES |  | NULL |  | 
      | alpha   | float   | YES |  | NULL |  | 
      | N    | smallint(6) | YES |  | NULL |  | 
      | g    | float   | YES |  | NULL |  | 
      | a    | float   | YES |  | NULL |  | 
      | seed   | float   | YES |  | NULL |  | 
      | startingWeight | float   | YES |  | NULL |  | 
      | path   | varchar(1000) | YES | UNI | NULL |  | 
      | type   | varchar(100) | YES |  | NULL |  | 
      +----------------+---------------+------+-----+---------+-------+ 
      12 rows in set (0.00 sec) 


      SELECT p FROM rParam GROUP BY p; 

      +--------+ 
      | p  | 
      +--------+ 
      |  0 | 
      | 0.001 | 
      | 0.002 | 
      | 0.003 | 
      | 0.004 | 
      | 0.005 | 
      | 0.0075 | 
      | 0.008 | 
      | 0.01 | 
      | 0.012 | 
      | 0.0125 | 
      | 0.014 | 
      | 0.015 | 
      | 0.02 | 
      | 0.025 | 
      | 0.03 | 
      | 0.035 | 
      | 0.04 | 
      | 0.05 | 
      | 0.1 | 
      | 0.2 | 
      | 0.3 | 
      | 0.4 | 
      | 0.5 | 
      | 0.6 | 
      | 0.7 | 
      +--------+ 
      26 rows in set (0.00 sec) 

ich die Ergebnisse für eine Art von Abfrage bekommen:

  SELECT p FROM rParam WHERE p=0.5 GROUP BY p; 
      +------+ 
      | p | 
      +------+ 
      | 0.5 | 
      +------+ 
      1 row in set (0.00 sec) 

jedoch den p-Wert zu ändern, die ich um:

  SELECT p FROM rParam WHERE p=0.6 GROUP BY p; 
      Empty set (0.00 sec) 

aber wir können deutlich von der ersten Ausgabe sehen, dass es Zeilen, für die p = 0,6? Dies ist ein Problem für die meisten p-Werte - warum gibt mySQL die leere Menge zurück?

Antwort

5

Das klingt wie ein Rundungsfehler. Fließkommazahlen können nicht immer genau in binärer Form dargestellt werden. Versuchen Sie, einige epsilon Anwendung:

SELECT DISTINCT p 
FROM rParam 
WHERE ABS(p - 0.6) < 0.00001 

Wenn Sie genaue Bruchzahlen möchten, verwenden Sie DECIMAL statt FLOAT als Spaltendatentyp.

ps. Wahrscheinlich besser, SELECT DISTINCT anstelle von GROUP BY zu verwenden.

+0

scheint der Trick zu tun :) danke – Kaare

2

Der Wert 0,6 kann nicht genau in einem Float gespeichert werden, sondern 0,5. Float-Nummern werden binär gespeichert. 1/2 kann genau gelagert werden, auch 1/4 und 3/4, 1/8, 3/8, 5/8 und 7/8. Aber 0,6 kann nicht als Bruch mit einer Potenz von 2 auf dem Nenner geschrieben werden. Es kann also nicht genau in Binärformaten gespeichert werden.

Verwandte Themen