Witam.
Możecie mi wyjaśnić dlaczego SQLite
zaokrągla wartość 0,245 do 0,24

ale 1,245 już do 1,25

?
To jakieś zamierzone działanie czy błąd?
Witam.
Możecie mi wyjaśnić dlaczego SQLite
zaokrągla wartość 0,245 do 0,24

ale 1,245 już do 1,25

?
To jakieś zamierzone działanie czy błąd?
Od taką odpowiedź znalazłem:
SQLite uses binary arithmetic and in binary, there is no way to write 9.95 in a finite number of bits. The closest to you can get to 9.95 in a 64-bit IEEE float (which is what SQLite uses) is 9.949999999999999289457264239899814128875732421875. So when you type "9.95", SQLite really understands the number to be the much longer value shown above. And that value rounds down.
This kind of problem comes up all the time when dealing with floating point binary numbers. The general rule to remember is that most fractional numbers that have a finite representation in decimal (a.k.a "base-10") do not have a finite representation in binary (a.k.a "base-2"). And so they are approximated using the closest binary number available. That approximation is usually very close, but it will be slightly off and in some cases can cause your results to be a little different from what you might expect.
To teraz pytanie jak sobie zapewnić poprawne zaokrąglanie :)?
Powinieneś skorzystać z bazy danych posiadającej więcej typów danych. W MySQL'u zrobiłbyś kolumnę typu DECIMAL i po kłopocie.
https://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html
No tak, tylko, że zmiana bazy nie wchodzi w grę.
Baza jest dołączana do małego programu, bez sensu jest "zmuszać" użytkownika do instalacji silnika bazy.
No w SQLite ponoć też powinno to działać:
http://stackoverflow.com/questions/21757722/how-to-use-sqlite-decimal-precision-notation
To nie jest bug tylko feature:
http://marc.info/?l=sqlite-users&m=130419182719263
Jeśli Ci przeszkadza (bo np. liczysz coś dla US, ZUS czy KRUS), zrób swoje zaokrąglanie - na liczbach integer.
Wbudowany algorytm raczej Ci nie będzie pasować w takim wypadku.
@Mr.YaHooo: FireBirda testowałem przed wyborem SQLite i coś mi nie pasowało/ czegoś brakowało (nie pamiętam co).
@Marcin.Miga w przykładzie który wrzuciłeś ROUND (0.245, 2) = 0.25 a u mnie 0.24 pytanie dlaczego skoro tu i tu SQLite (pisze z tel więc nie mam jak się pobawić i poszukac).
@Marcin.Miga: uruchamiając lokalnie otrzymuje dwa wyniki.
Wychodzi na to że jest to, że w bibliotekach używanych przez SQLFiddle jest to zmienione.
Tak czy inaczej dziękuję za pokazanie jak zrobić swoje zaokrąglanie.