Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> dziwne działanie round()
vi-valdi
post 28.01.2004, 18:52:37
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.
-
Go to the top of the page
+Quote Post
scanner
post 28.01.2004, 20:07:15
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.


--------------------
scanner.info
Warto pamiętać: KISS, DRY
Go to the top of the page
+Quote Post
vi-valdi
post 28.01.2004, 21:07:11
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ę.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 19:58