![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 9.11.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Czy ktoś wie dlaczego tak się dzieje.
Uruchamiam dwa prawie identyczne kody" Kod 1 [php:1:25440baf64]<?php $cena = 9.1*0.75; // = 6.825 $cena_z = round ($cena, 2); print ("<p>$cena_z</p>"); print ("<p>" .gettype($cena). "</p>"); print ("<p>" .gettype($cena_z). "</p>"); ?>[/php:1:25440baf64] Kod 2 [php:1:25440baf64]<?php $cena = 6.825; $cena_z = round ($cena, 2); print ("<p>$cena_z</p>"); print ("<p>" .gettype($cena). "</p>"); print ("<p>" .gettype($cena_z). "</p>"); ?>[/php:1:25440baf64] Zmienna $cena_z jest zaokrąglana do dwóch miejsc po przecinku. Zmienne $cena i $cena_z sprawdzam gettype() aby mieć pewność, że są double. A teraz przedstawiam wynik działania powyższych kodów Kod 1 Kod 6.82
double double Kod 2 Kod 6.83
double double ? dlaczego Kod 1 daje wynik 6.82, a Kod 2 daje wynik 6.83. Wydaje mi się, że wyniki powinny być identyczne. A może robię gdzieś jakiś błąd. - |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
[php:1:f9be7e1d43]<?php
$cena = 9.1*0.75; // = 6.825 var_dump($cena); // float(6.825) ?>[/php:1:f9be7e1d43]float, nie double - zatem round może inaczej zaokrąglić moim zdaniem. -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 37 Pomógł: 0 Dołączył: 9.11.2003 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dzięki scanner, naprowadziłeś mnie tym float
Cała sprawa leży w precyzji liczb zmiennoprzecinkowych. EX z manuala Cytat floor((0.1+0.7)*10) zwykle ma wartość 7, zamiast oczekiwanej 8, gdyż wewnętrzna reprezentacja tego wartości to liczba 7.9999999999....
Widocznie 9.1 * 0.75 = 6.825 jest reprezentowane przez 6.8249999999... i round ($cena, 2) zaokrągla wg 0.004 w dół. Żeby mieć dokładny wynik trzeba zastosować: arytmetyke liczb dużej precyzji. [php:1:34b6477e4e]<?php $cena = bcmul ( 9.10, 0.75, 3); ?>[/php:1:34b6477e4e] --- załatwia sprawę. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 26.06.2025 - 19:58 |