Funktioniert eine einfache Explosion? $ splitDec = explode (".", $ decimal); $ splitDec [0] wird jetzt durch die 1 und splitDec [1] wird jetzt 25 von Ihrem Beispiel sein.
Matt
@Matt split()ist veraltet.
Alex
@alex ja, vergessen. Dachte Javascript. geändert, um zu explodieren.
Matt
@Matt, split ist ab PHP 5.3 veraltet und verwendet tatsächlich einen regulären Ausdruck als Argument, während explode eine Zeichenfolge verwendet. explode () wird in diesem Fall bevorzugt.
Shelhamer
4
Seien Sie sich bewusst, explode(".",1.10);dass Sie 1 und 1 geben werden, nicht 1 und 10
Als Seite intval()oder einfaches Casting, das (int)vielleicht performanter ist alsfloor()
Jason McCreary
1
Wie berücksichtigt Floor Negative?
LanceH
@LanceH: Das tut es nicht, aber Sie können es mit einer negativen Flagge ziemlich einfach handhaben.
Brad Christie
4
Diese Antwort ist tatsächlich ungenau, es sei denn, Sie fügen eine Runde hinzu (). Klingt dumm, ich weiß, aber es hat mit Gleitkommazahlenarithmetik auf niedriger Ebene zu tun. Siehe hier: stackoverflow.com/questions/3726721/php-math-precision
Matt James
Versuchen Sie es mit 510,9, und geben Sie 0,89 zurück. Kann aber nicht sagen warum.
Seien Sie sich bewusst, explode(".",1.10);dass Sie 1 und 1 geben werden, nicht 1 und 10
Michel
3
Dies unterbricht und warnt vor einem undefinierten Index, wenn die Zahl eine Ganzzahl ist oder keinen Dezimalteil enthält.
Andreyco
1
Dies setzt voraus, dass die Zahl nicht in wissenschaftlicher Notation dargestellt wird, wenn sie in einen String umgewandelt wird. Wenn es sich um eine wirklich sehr große oder sehr kleine Zahl handelt, ist dies nicht der Fall und diese Methode wird nicht funktionieren.
Dieser wird nicht unterbrochen, wenn die Zahl keinen Dezimalteil enthält. Toll!
Andreyco
Schön, dass dies zwei ganze Zahlen ausgibt; eher als ein int und ein float.
Foochow
1
Dies setzt voraus, dass die Zahl nicht in wissenschaftlicher Notation dargestellt wird, wenn sie in einen String umgewandelt wird. Wenn es sich um eine wirklich sehr große oder sehr kleine Zahl handelt, ist dies nicht der Fall und diese Methode wird nicht funktionieren.
GordonM
18
Die floor () -Methode funktioniert nicht für negative Zahlen. Dies funktioniert jedes Mal:
Es gibt auch eine fmod-Funktion, die verwendet werden kann: fmod ($ my_var, 1) gibt das gleiche Ergebnis zurück, jedoch manchmal mit einem kleinen runden Fehler.
Hinweis: Wenn Sie dies tun, sollten Sie mindestens round ($ decimal, 2) verwenden. Stellen Sie zunächst sicher, dass Sie nur zwei Dezimalstellen haben. Sie können dies jedoch nicht verwenden, wenn Sie die richtige Mathematik haben oder mit Geld umgehen möchten.
Ulrik McArdle
0
Um die zusätzliche Gleitkommazahl zu vermeiden (dh 50,85 - 50 ergeben 0,850000000852), benötige ich in meinem Fall nur 2 Dezimalstellen für Geld-Cent.
Es fiel mir schwer, einen Weg zu finden, um den Dollarbetrag und den Betrag nach der Dezimalstelle tatsächlich zu trennen. Ich glaube, ich habe es meistens herausgefunden und dachte, ich sollte mitteilen, ob jemand von euch Probleme hat
Also im Grunde genommen...
Wenn der Preis 1234,44 ist ... wäre das Ganze 1234 und die Dezimalstelle wäre 44 oder
Wenn der Preis 1234,01 ist ... wäre das Ganze 1234 und die Dezimalstelle wäre 01 oder
Wenn der Preis 1234,10 ist, wäre das Ganze 1234 und die Dezimalstelle 10
und so weiter
$price =1234.44;
$whole = intval($price);// 1234
$decimal1 = $price - $whole;// 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1,2);// 0.44 this will round off the excess numbers
$decimal = substr($decimal2,2);// 44 this removed the first 2 charactersif($decimal ==1){ $decimal =10;}// Michel's warning is correct...if($decimal ==2){ $decimal =20;}// if the price is 1234.10... the decimal will be 1...if($decimal ==3){ $decimal =30;}// so make sure to add these rules tooif($decimal ==4){ $decimal =40;}if($decimal ==5){ $decimal =50;}if($decimal ==6){ $decimal =60;}if($decimal ==7){ $decimal =70;}if($decimal ==8){ $decimal =80;}if($decimal ==9){ $decimal =90;}
echo 'The dollar amount is '. $whole .' and the decimal amount is '. $decimal;
In diesem Fall beides bekommen $wholeAs?und $decimalnicht vom anderen abhängen. (Sie können nur 1 der 3 Ausgänge unabhängig voneinander nehmen.) Ich habe gezeigt $wholeAsFloatund $wholeAsIntweilfloor() eine Float-Typ-Nummer zurückgegeben wird, obwohl die zurückgegebene Nummer immer ganz ist. (Dies ist wichtig, wenn Sie das Ergebnis an einen typabhängigen Funktionsparameter übergeben.)
Ich wollte, dass eine Gleitkommazahl von Stunden / Minuten, z. B. 96,25, für eine DateInterval- Instanz getrennt in Stunden und Minuten als 96 Stunden 15 Minuten aufgeteilt wird. Ich habe das wie folgt gemacht:
split()
ist veraltet.explode(".",1.10);
dass Sie 1 und 1 geben werden, nicht 1 und 10Antworten:
Dann vergleiche mit 1/4, 1/2, 3/4 usw.
Verwenden Sie bei negativen Zahlen Folgendes:
Das
$returnUnsigned
hält es davon ab, -1,25 in -1 & -0,25 zu machenquelle
intval()
oder einfaches Casting, das(int)
vielleicht performanter ist alsfloor()
Dieser Code teilt es für Sie auf:
Dabei ist $ ganz die ganze Zahl und $ dezimal die Ziffern nach dem Dezimalpunkt.
quelle
explode(".",1.10);
dass Sie 1 und 1 geben werden, nicht 1 und 10Nur um anders zu sein :)
CodePad .
Als zusätzlichen Vorteil wird es nur aufgeteilt, wenn beide Seiten aus Ziffern bestehen.
quelle
Die floor () -Methode funktioniert nicht für negative Zahlen. Dies funktioniert jedes Mal:
... funktioniert auch für Negative (gleicher Code, unterschiedliche Nummer):
quelle
ein kurzer weg (benutze boden und fmod)
Vergleichen Sie dann $ decimal mit 0, .25, .5 oder .75
quelle
(a % 1)
UND verarbeitet negative Zahlen gut.Wirf es als int und subtrahiere
Oder nur um die Dezimalstelle zum Vergleich zu erhalten
quelle
Es gibt auch eine fmod-Funktion, die verwendet werden kann: fmod ($ my_var, 1) gibt das gleiche Ergebnis zurück, jedoch manchmal mit einem kleinen runden Fehler.
quelle
PHP 5.4+
quelle
Dies ist der Weg, den ich benutze:
quelle
Brad Christies Methode ist im Wesentlichen korrekt, kann aber präziser geschrieben werden.
Dies entspricht seiner Methode, ist jedoch kürzer und dadurch hoffentlich leichter zu verstehen.
quelle
quelle
Wenn Sie sich darauf verlassen können, dass es immer 2 Dezimalstellen hat, können Sie einfach eine Zeichenfolgenoperation verwenden:
Keine Ahnung von Leistung, aber für meinen einfachen Fall war das viel besser ...
quelle
Um die zusätzliche Gleitkommazahl zu vermeiden (dh 50,85 - 50 ergeben 0,850000000852), benötige ich in meinem Fall nur 2 Dezimalstellen für Geld-Cent.
quelle
Es fiel mir schwer, einen Weg zu finden, um den Dollarbetrag und den Betrag nach der Dezimalstelle tatsächlich zu trennen. Ich glaube, ich habe es meistens herausgefunden und dachte, ich sollte mitteilen, ob jemand von euch Probleme hat
Also im Grunde genommen...
Wenn der Preis 1234,44 ist ... wäre das Ganze 1234 und die Dezimalstelle wäre 44 oder
Wenn der Preis 1234,01 ist ... wäre das Ganze 1234 und die Dezimalstelle wäre 01 oder
Wenn der Preis 1234,10 ist, wäre das Ganze 1234 und die Dezimalstelle 10
und so weiter
quelle
Ich habe hier keinen einfachen Modul gesehen ...
In diesem Fall beides bekommen
$wholeAs?
und$decimal
nicht vom anderen abhängen. (Sie können nur 1 der 3 Ausgänge unabhängig voneinander nehmen.) Ich habe gezeigt$wholeAsFloat
und$wholeAsInt
weilfloor()
eine Float-Typ-Nummer zurückgegeben wird, obwohl die zurückgegebene Nummer immer ganz ist. (Dies ist wichtig, wenn Sie das Ergebnis an einen typabhängigen Funktionsparameter übergeben.)Ich wollte, dass eine Gleitkommazahl von Stunden / Minuten, z. B. 96,25, für eine DateInterval- Instanz getrennt in Stunden und Minuten als 96 Stunden 15 Minuten aufgeteilt wird. Ich habe das wie folgt gemacht:
Sekunden waren mir in meinem Fall egal.
quelle
quelle