![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 90 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Skrypt:
<?php echo 12.00 - 11.99; ?> na linuxie wersja php 4.4.10 (sprawdzone na dwoch serwarach) wynik: 0.0099999999999998 na windowsie wersja php 4.3.9 wynik: 0.01 Ktos mial juz taki problem? I to jest duzy problem, bo blad ten pojawia sie w serwisie ecommerce, gdzie takie obliczenia sa istotne. Na razie jedyne rozwiazanie jakie widze to wszedzie z obliczeniami gdzie wystepuje odejmowanie dodawac round: <?php echo round(12.00 - 11.99, 2); ?> -------------------- code.gosu.pl
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 315 Pomógł: 1 Dołączył: 6.08.2003 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
Może okaże sie że sie myle, ale uczyłeś się architektury komputerów? Liczby ułamkowe zapisywane w systemach dwójkowych są przeważnie przybliżeniem liczby którą chce sie zapisać. Jest to wynikiem ograniczonych mozliwości systemu dwójkowego np. liczba 0.3 ma w systemi dwójkowym rozwinięcie okresowe. Jeśli zapiszemy ją na 8 bitach tom po ponowym przekonwertowaniu jej na system dziesiętny otrzymamy 0,296875 czyli bląd na 1,05%( przykład zaczerpnięty z książki).
Jednak co jest śmieszne jeśli dodasz spowrotem to co odjołęś wynik będzie dobry ![]()
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 90 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Opole Ostrzeżenie: (0%) ![]() ![]() |
Juz mi paru linuxowcow dalo wyklad na temat cech i mantys. Ale oni nic nie rozumieja, ze po odjeciu 11.99 od 12.00 powinno byc 0.01. Bill Gates power O_o
-------------------- code.gosu.pl
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 315 Pomógł: 1 Dołączył: 6.08.2003 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
No powinno i nic nie poradzisz chyba że masz jakąs opcje żeby liczby kodować systemem dwójkowo-dziesiętnym- najbardziej dokładny do liczb zmienno przecinkowych ale też chyba bardziej pamięcio żerny- wymaga więcej bajtów na liczbe. Żeby sie za bardzo nie motać użyj ceil() lub round()
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 135 Pomógł: 0 Dołączył: 30.09.2005 Skąd: k-rk Ostrzeżenie: (0%) ![]() ![]() |
albo mozna pracowac na liczbach calkowitych i dopiero na samym koncu zamieniac na zmiennoprzecinkowe
-------------------- There are 10 types of people in the world:
-Those who understand binary, and those who don't... There's no place like 127.0.0.1 |
|
|
![]()
Post
#6
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 853 Pomógł: 25 Dołączył: 27.08.2003 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
ja tylko dodam ze problem ten oczywiscie dotyczy zarowno linuxa jak i windowsa. (btw - nie na temat - mysqla tez dlatego tam gdzie mozna i tam gdzie bedziemy stosowac porownania itp. to lepiej stosowac DECIMAL niz FLOAT)
-------------------- "If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat(ghostrider @ 2005-11-02 10:16:40) albo mozna pracowac na liczbach calkowitych i dopiero na samym koncu zamieniac na zmiennoprzecinkowe
Jest tylko male ale, juz tutaj "tracisz precyzje": $b = 11.99 * 100; ![]() Ale gdy potrzebujesz jedynie 2 cyfr po przecinku -- wystarczy int, a na koniec podziel przez 100. -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#9
|
|
![]() Developer Grupa: Moderatorzy Postów: 2 844 Pomógł: 20 Dołączył: 25.11.2003 Skąd: Olkusz ![]() |
juz byl taki temat, o ile dobrze pamietam.
I to nie byla wina php z tego co pamietam to Seth pokazywal to samo w innych jezykach. To wina komputera |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.07.2025 - 08:07 |