2014-12-24 14 views
8

Cześć Byłem problem zaokrąglania liczb do -0 zamiast tylko kodemPHP: Number_format zaokrąglania

:

<?php 
$num= 0.000000031; 

$round = number_format((float)$num, 1, '.', ''); 

echo $round * -1; 
?> 

wyjściowa: -0

oczekiwana moc wyjściowa:

Szukałem rozwiązania, ale nic nie znalazłem.

uprzejmie wyjaśnić & mi pomóc dlaczego zaokrągla się do -0 zamiast ? dziękuję

+0

co jest '$ xx' ...? – Riad

+0

1. '$ xx' to myślę' $ num' 2. Dlaczego masz wiele '* -1'? – Rizier123

+1

@Riad zaktualizowany przepraszam litero –

Odpowiedz

6

Brak zaokrąglenia powoduje, że -0.

Zmienna $ runda zawiera ten przed ostatnim wierszu:

string(3) "0.0" 

Można to sprawdzić z dodaniem tej linii:

var_dump($round); 

przed echa.

Więc jeśli pomnożyć "0.0" (string) z -1 wtedy wynik będzie "-0"

Bo (string) 0 jest lanego do (float) 0 przed mnożeniem i

(float)0 * -1 = -0 

php5 -r 'var_dump((float)0*-1);' 
float(-0) 

Co jest całkowicie normalne w oparciu o zachowanie liczb zmiennoprzecinkowych. (Więcej szczegółów: http://en.wikipedia.org/wiki/Signed_zero)

Jeśli jest to problem można dodać 0, aby uniknąć tej "magii":

php5 -r 'var_dump((float)0*-1+0);' 
float(0) 
+0

Bardzo dobre wyjaśnienie! (Podpisany zero nie wiedział tego!) Zobacz także: http://3v4l.org/kANUX (ciekawe, która wersja php robi różne rzeczy) – Rizier123

+0

naprawdę dobra ... – Riad

+0

dobra droga i zdrowy rozsądek ** 0 + -0 = 0 **, co jest prostym sposobem na uczynienie go pozytywnym i nigdy o tym nie myśl. dziękuję dużo :) –

0

Kod PHP jest zdezorganizowany.

Zakładam, że var $ xx w drugiej linii to $ num.

Następnie, należy najpierw wykonać wszystkie operacje (warstwa operacji), a następnie wykonać warstwę prezentacji (prezentacja):

<?php 
    // Operation layer 
    $num = 0.000000031; 
    $round = $num * -1; 

    // Presentation layer 
    echo number_format($round, 1, '.', ''); 

kiedy wykonujesz Number_format odzyskać ciąg, a nie liczba.

+0

Pytanie jest, dlaczego zaokrągla się do '-0' – Rizier123

+0

samo, jeśli wypróbujesz swój kod to wyjścia ** -0,0 **. –

0

Od number_format zwraca ciąg, trzeba rzucać je, aby uzyskać oczekiwany rezultat.

<?php 

$num= 0.000000031; 

$round = number_format((float)$num, 1, '.', ''); 

echo (int)$round * (-1); //print 0 

?> 

PHP Sandbox

+0

Ale to również daje '-0':' echo (float) 0.0 * -1; 'dlaczego? – Rizier123

Powiązane problemy