![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 16.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
ostatnio spotkałem się z dość dziwną sytuacją. Zrobiłem programik w PHP który zlicza mi pewne dane typu float z bazy mySQL. Operacje obliczeniowe wykonało samo zapytanie SQL-a. Problem pojawia mi się dopiero wtedy gdy zaczynam mnożyć przez siebie liczby które mają np jedno miejsce po przecinku, np. gdy pomnoże: 2*5,3 to wynik jest 10,6 ale gdy pomnoże 3*5,3 to wynik jest 15,8999999999999998 zauważyłem że jeśli pomnożył bym 5,3 razy wielokrotność liczby 3 to również będzie zwracalo jakieś głupoty. Przeciesz oczywiste jest że wynik powinien wyjść 15,9 a nie 15,899999998 Skąd te błędy? Zauważyłem również, że w javascript gdy mnoże dwie wartości z pól edit przez siebie to sytuacja jest identyczna. Dla przykładu podam jeszcze, że np 3*5,4 = 16.200000000000003 - a nie jak powinno być 16,2. Skąd się biorą te błędy i jak je wyeliminować? z góry dzięki za odpowiedzi. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jak wspomniano, wynika to z niedoskonałości zapisu danych dziesiętnych w systemie binarnym. Niektóre języki mają ten problem rozwiązany odpowiednią biblioteką (przykładowo C posiada bcd.h), ale ich użycie jest związane ze zwiększonym zapotrzebowaniem na zasoby. Jeśli jednak nie masz takiej możliwości to pozostaje jedynie zwiększanie dokładności. Z tego co pamiętam istnieje w php.ini zmienna związana z tym. Zrób Ctrl+F z frazą floating to znajdzie Ci liczbę określającą precyzję wykonywanych działań na liczbach zmiennoprzecinkowych. Domyślnie jest chyba 14
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 10.10.2025 - 21:09 |