2016-06-29 15 views
1

Ich habe ein seltsames Rundungsproblem. HierRundungsfehler in Mysql 5.5 +?

ist das Setup (MySQL5.5 Percona; gleiche in Mysql 5.7 CE):

CREATE TABLE `roundingtest` (
`RT_Double` DOUBLE NULL DEFAULT NULL, 
`RT_Float` FLOAT NULL DEFAULT NULL, 
`RT_Decimal` DECIMAL(10,3) NULL DEFAULT NULL 
) 
ENGINE=InnoDB; 

nun in jedem der drei Felder "1.785" eingeben.

nun diese Abfrage ausführen:

SELECT 
1.785, ROUND(1.785, 2), 
RT_Double, ROUND(RT_Double, 2), 
RT_Float, ROUND(RT_Float, 2), 
RT_Decimal, ROUND(RT_Decimal, 2) 
FROM roundingtest 

Hier sind die Ergebnisse: rounding 2

Wenn Sie auf eine Dezimalstelle runden: rounding 1

jemand bitte erklären dieses Verhalten ...

Es ist nur korrekt mit dem Feld DECIMAL, auch mit nur 3 Dezimalstellen.

Antwort

2

Von MySQL Rounding Behaviour:

Für ungefähre Wertnummern, hängt das Ergebnis von der Bibliothek C. Auf vielen Systemen bedeutet dies, dass ROUND() die Regel "Runde zum nächsten geraden" verwendet: Ein Wert mit einem beliebigen Bruchteil wird auf die nächste gerade ganze Zahl gerundet.

Dies bedeutet, dass Fließkommazahlen auf die nächste gerade ganze Zahl gerundet werden können. DECIMAL Zahlen werden als exakt betrachtet, also werden Bruchzahlen von 0,5 oder mehr aufgerundet.

2

Es ist wahrscheinlich aufgrund der Art und Weise, wie Gleitpunkte auf einem Computer gespeichert werden, nicht vollständig genau (aufgrund der Speicherung in der Basis 2, nicht Basis 10). Wenn 1,785 als 1,784998 gespeichert wird, würde es abgerundet werden. Wenn es als 1,785001 gespeichert wird, würde es zusammenlaufen.

Verwandte Themen