Wie bekommt man eine Nummer?
Gibt es eine (einfache) Möglichkeit, um die "Zeichen" von einer Zahl (integer) in PHP vergleichbar gmp_sign
Docs:
- -1 negative
- 0 null
- 1 positive
Ich erinnere mich, es ist eine Art von vergleichen, die Funktion, die dies tun können, aber ich bin nicht in der Lage, es zu finden, im moment.
Ich schnell kompiliert diese ( Demo ), die nicht den job, aber vielleicht gibt es etwas mehr nifty (wie ein einziger Funktionsaufruf?), Ich möchte anzeigen, das Ergebnis in ein array:
$numbers = array(-100, 0, 100);
foreach($numbers as $number)
{
echo $number, ': ', $number ? abs($number) / $number : 0, "\n";
}
(dieser code kann ausgeführt werden in floating-point-Präzision Probleme wahrscheinlich)
Verwandte: Anfrage #19621 Mathe braucht ein "Zeichen ()" - Funktion
InformationsquelleAutor der Frage hakre | 2011-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Coole one-liner, die es für Sie effizient und zuverlässig:
InformationsquelleAutor der Antwort Milosz
In PHP 7 sollten Sie die kombiniert Vergleichsoperator (
<=>
):InformationsquelleAutor der Antwort Peping
Eine Variante der oben in meiner Frage, die ich getestet habe und die funktioniert so gut und hat nicht die floating-point-problem:
Edit: Der obige code hat einen Fehler für float-zahlen (Frage wurde über die integer-zahlen) im Bereich von größer als
-1
und kleiner als1
die befestigt werden kann mit den folgenden shorty:Dass man noch eine Lücke für den Schwimmer
NAN
machen es zurück-1
immer. Das könnte nicht richtig sein. Stattdessen könnte man zurückgeben möchten0
:InformationsquelleAutor der Antwort hakre
Können Sie nest ternäre Operatoren:
Dieser hat kein problem mit floating-point-Präzision und vermeidet eine floating point division.
InformationsquelleAutor der Antwort rocksportrocker
Was ist falsch mit dieser form?
oder ternär:
Nicht sicher, dass die Leistung von
abs
vs-Wert-Vergleich, aber man könnte:und man konnte jede von Ihnen in eine Funktion:
Ich nehme an, man könnte darüber reden,
gmp_cmp
die Sie anrufen könnte, alsgmp_cmp( $num, 0 );
InformationsquelleAutor der Antwort zzzzBov
Ich denke, dass gmp_sign ist nicht sehr effizient, da es erwartet, dass ein GMP oder string.
($n ? abs($n)/$n : 0) ist zwar mathematisch korrekt, aber die division kostet Zeit.
Die min/max-Lösungen scheinen unnötig Komplex für Schwimmer.
($n > 0) - ($n < 0) immer 2 tests und eine Subtraktion
($n < 0 ? -1 : ($n > 0 ? 1 : 0) macht einen oder zwei tests und keine arithmetische ist, sollte es möglichst effizient.
Aber ich glaube nicht, dass der Unterschied relevant für die meisten Anwendungsfälle.
InformationsquelleAutor der Antwort Rolf
Ich weiß, das ist spät, aber was einfach das teilen der Zahl durch die abs() für Sie selbst?
Etwas wie:
Setzen, was die Fehlerbehandlung, die Sie wollen, für div durch null.
InformationsquelleAutor der Antwort user2016279
Hier ist einer, der ohne Schleife:
InformationsquelleAutor der Antwort Yeroon
Verwenden
strcmp
Docs:InformationsquelleAutor der Antwort Toto