2014-12-24 8 views
8

Hallo Ich habe ein Problem mit Zahlen zu -0 statt nur einenPHP: number_format Runden

Code Runden:

<?php 
$num= 0.000000031; 

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

echo $round * -1; 
?> 

Ausgang: -0

erwartete Ausgabe:

Ich habe nach einer Lösung gesucht, aber nichts gefunden.

freundlich erklären & mir helfen, warum es rundet bis zu -0 statt ? danke

+0

was '$ xx' ...? – Riad

+0

1. '$ xx' ist ich denke' $ num' 2. Warum multiplizieren Sie '* -1'? – Rizier123

+1

@Riad aktualisiert sorry typo –

Antwort

6

Nicht die Rundung macht es -0.

Die runde Variable $ enthält diese vor der letzten Zeile:

var_dump($round); 

vor dem Echo:

string(3) "0.0" 

Sie diese mit Hinzufügen dieser Zeile überprüfen kann.

Also, wenn Sie multiplizieren "0.0" (string) mit -1 dann wird das Ergebnis sein "-0"

Weil (string) 0 bis (float) gegossen wird 0 vor der Multiplikation und

(float)0 * -1 = -0 

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

Das ist völlig normal auf der Grundlage der Floating-Nummern-Verhalten. (Weitere Informationen: http://en.wikipedia.org/wiki/Signed_zero)

Wenn dies ein Problem ist, dass Sie 0 hinzufügen, können diese „Magie“ zu vermeiden:

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

Sehr gute Erklärung! (Signed Zero wusste das nicht!) Schauen Sie auch hier: http://3v4l.org/kANUX (interessant, welche PHP-Version verschiedene Dinge tun) – Rizier123

+0

wirklich gut eins ... – Riad

+0

guten Weg & es macht einen gesunden Menschenverstand ** 0 + -0 = 0 ** was eine einfache Möglichkeit ist, es positiv zu machen und niemals daran zu denken. Danke viel :) –

0

Sie PHP-Code ist es unorganisiert.

Ich nehme an, var $ xx in der zweiten Zeile ist es $ num.

Dann müssen Sie zuerst alle Operationen ausführen (Funktionsschicht) und führen Sie dann Präsentationen (Präsentationsschicht):

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

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

Wenn Sie eine number_format tun, um eine Zeichenfolge abzurufen, keine Zahl.

+0

Die Frage ist, warum es auf "-0" – Rizier123

+0

gleiche Sache, wenn Sie Ihren Code versuchen es ausgibt ** -0,0 **. –

0

Da number_format kehrt Zeichenfolge, müssen Sie es werfen erwartetes Ergebnis zu erhalten.

<?php 

$num= 0.000000031; 

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

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

?> 

PHP Sandbox

+0

Aber das gibt auch '-0':' echo (float) 0.0 * -1; 'warum? – Rizier123