Temat: WTF PHP ?
Andrzej Prażmo:
Dariusz Półtorak:
Problem porównywania liczb zmiennoprzecinkowych istnieje w niemal każdym języki i wynika z ich natury.
Ależ ja o tym doskonale wiem. Ja tylko piszę, że twórcy innych języków poradzili sobie z tym problemem wprowadzając typ decimal i dziwię się, że nie przyszło to do głowy twórcom PHP. Jaki to problem wprowadzić taki typ zmiennej i np. dodać funkcję pt.
"od_tej_pory_traktuj_wszystkie_liczby_z_przecinkiem_jako_decimal()"
Wywołanie takiej funkcji dawałoby się na początku skryptu i problem z głowy. Kompatybilność byłaby zachowana a nikt nie musiałby uskuteczniać spaghetti programmingu z funkcjami bcadd, bcsub.
Eh, ile razy mamy Ci to tłumaczyć ? Nawet mój kot by to zrozumiał do teraz. PHP jest dynamicznie typowany. Masz FLOAT jak w każdym języku ZE WSZYSTKIMI JEGO WADAMI. To o czym mówisz to zwykła klasa, moduł języka który ma jakoś problem z precyzją liczb zmiennoprzecinkowych rozwiązać.
Teraz weź mi ku*** wytłumacz gdzie wg Ciebie masz to spaghetti programming między tym:
Decimal(1) / Decimal(7)
a tym:
bcdiv(1, 7, 50); // określiłem sobie precyzję btw
Wynik:
0.1428571428571428571428571429 (Python)
0.14285714285714285714285714285714285714285714285714 (PHP)
Tak na zdrowy chłopski rozum Python właśnie zrobił mi coś niemiłego bo zaokrąglił końcówkę tam gdzie mu się podobało podając znacznie mniej dokładny niż uzyskałem z użyciem bcdiv. Dobrze że to Twoje straszne bcdiv pozwoliło mi określić precyzję w dziecinny sposób dając mi dokładniejszy wynik.
Punkt widzenia zależy od punktu patrzenia. Teraz może ja zacznę narzekać czemu Twój wspaniały Decimal nie dał mi prostego i intuicyjnego sposobu na określenie precyzji działania...
//I jeszcze żeby domknąć ten temat:
bcdiv(1, 7, 1000);
0.1428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428571428
// EDIT 2
I jeszcze coś dla Ciebie Andrzeju. Apropo porównywania gołego floata w PHP z klasą Decimal w Pythonie (rozumiem że ten język miałeś na myśli). Twój przykład na który tak narzekasz zrealizowany w Pythonie. Kropka w kropkę to co napisałeś wyżej:
x = 1.7;
y = 1.9;
a = x + 0.1;
b = y - 0.1;
if a == b:
print 'a i b sa takie same';
else:
print 'a i b sa rozne';
Nie muszę chyba mówić że wynik to: "a i b sa rozne". Uwielbiasz widzę jeździć po PHP od czasu do czasu ale jakoś nigdy Ci nie wychodzi.
Dariusz Półtorak edytował(a) ten post dnia 25.09.12 o godzinie 12:59