2011-12-12 10 views
7

Pracuję nad małym sklepem internetowym i staram się uzyskać najniższą cenę produktu (zdjęcia).dziwna wartość języka SQL()

więc sprawdzić, co najniższa cena jest dodawany (Zdjęcia można zamówić w różnych rozmiarach):

SELECT 
    MIN(price) as price 
FROM 
    rm_prices 
WHERE 
    photo_id = '47' AND 
    price != '0' 

ta zwraca najmniejszą wartość znalezionych dla tego produktu.

Kiedy sprawdzam swoją bazę danych, widzę, że najniższa wartość to 1256,3.
Po wydrukowaniu wyniku otrzymam numer 1256.30004882813.
Wartość jest ustawiona jako FLOAT.

Dlaczego wynik jest 1256.30004882813, a nie 1256.3?

+0

Sprawdź to, bardzo ważne jest, aby wiedzieć, jak działa arytmetyka FLOATING point, ponieważ zadziwi Cię, jeśli założysz, że zawsze jest "idealnie dokładna" ... http://citeseerx.ist.psu.edu/ viewdoc/summary? doi = 10.1.1.22.6768 – MatBailie

Odpowiedz

11

Ponieważ real number 1256,3 nie może być precyzyjnie reprezentowane floating point.

Powinieneś używać danych fixed-point datatype dla danych pieniężnych. Cytując z MySQL documentation:

W DECIMAL i NUMERIC typy przechowywania dokładnych danych liczbowych wartości. Te typy są używane, gdy ważne jest zachowanie dokładnej precyzji, np. , na przykład z danymi pieniężnymi.

1

1256.3 nie ma dokładnej reprezentacji w arytmetykach zmiennoprzecinkowych; z tego powodu zazwyczaj lepiej jest przechowywać sumy pieniędzy jako typy danych INTEGER lub DECIMAL.

Więcej informacji można znaleźć here.

Powiązane problemy