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: 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ę. |
|
|
|
vi-valdi dziwne działanie round() 28.01.2004, 18:52:37
scanner <?php
$cena = 9.1*0.75; // = 6.825
var_dump($ce... 28.01.2004, 20:07:15 ![]() ![]() |
|
Aktualny czas: 24.12.2025 - 11:47 |