SQLite - zaokrąglanie

0

Witam.

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

screenshot-20170310122014.png

ale 1,245 już do 1,25

screenshot-20170310122046.png
?

To jakieś zamierzone działanie czy błąd?

0

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.
0

To teraz pytanie jak sobie zapewnić poprawne zaokrąglanie :)?

0

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

0

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.

0

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.

0

@hipekk to użyj np. Firebirda. Ma wersję która nie wymaga instalacji. A obsługuje wszystko czego potrzeba.

0

@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).

1

@hipekk na SQLFiddle jest inna biblioteka (a nawet dwie do SQLite). Zanim opublikowałem sprawdzałem kod lokalnie i wyniki były różne (,24 i ,25). Ta druga formuła za każdym razem dawała ,25

0

@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.

0

@hipekk, ok. Nie mniej jednak sam tego używam na produkcji z pełnym serwerem oraz embedded. Ale nieważne skoro masz już rozwiązanie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1