Une simple explosion fonctionnera-t-elle? $ splitDec = exploser (".", $ décimal); $ splitDec [0] sera désormais de 1 et splitDec [1] sera désormais de 25 dans votre exemple.
Matt
@Matt split()est obsolète.
alex
@alex oui, j'ai oublié. Je pensais javascript. changé pour exploser.
Matt
@Matt, split est obsolète depuis PHP 5.3 et prend en fait une regex comme argument, alors qu'explode prend une chaîne. explode () est préféré dans ce cas.
Shelhamer
4
Sachez que explode(".",1.10);wil donnera 1 et 1, pas 1 et 10
En tant que côté, intval()ou simple casting qui (int)pourrait être plus performant quefloor()
Jason McCreary
1
Comment le plancher tient-il compte des négatifs?
LanceH
@LanceH: Ce n'est pas le cas, mais vous pouvez le faire gérer assez facilement avec un indicateur négatif.
Brad Christie
4
Cette réponse est en fait inexacte sauf si vous ajoutez un round (). Cela semble stupide, je sais, mais cela a à voir avec l'arithmétique des nombres à virgule flottante de bas niveau. Voir ici: stackoverflow.com/questions/3726721/php-math-precision
Matt James
Essayez avec 510,9, renvoie 0,89. Mais je ne peux pas dire pourquoi.
Sachez que explode(".",1.10);wil donnera 1 et 1, pas 1 et 10
Michel
3
Cela interrompt et jette un avertissement sur l'index non défini, si le nombre est un entier ou ne contient pas de partie décimale.
Andreyco
1
Cela suppose que le nombre ne finira pas par être représenté en notation scientifique lorsqu'il sera converti en chaîne. Si c'est un nombre vraiment vraiment énorme ou vraiment très petit, ce ne sera pas le cas et cette méthode échouera.
Celui-ci ne casse pas si le nombre ne contient pas de partie décimale. Génial!
Andreyco
Bien que cela génère deux entiers; plutôt qu'un int et un flottant.
foochow
1
Cela suppose que le nombre ne finira pas par être représenté en notation scientifique lorsqu'il sera converti en chaîne. Si c'est un nombre vraiment vraiment énorme ou vraiment très petit, ce ne sera pas le cas et cette méthode échouera.
GordonM
18
La méthode floor () ne fonctionne pas pour les nombres négatifs. Cela fonctionne à chaque fois:
Remarque: si vous faites cela, vous devriez au moins utiliser round ($ decimal, 2); d'abord pour vous assurer que vous n'avez que deux chiffres décimaux. Mais vous ne pouvez pas l'utiliser si vous voulez avoir des calculs corrects ou gérer de l'argent.
Ulrik McArdle le
0
Pour éviter la décimale flottante supplémentaire (c'est-à-dire 50,85 - 50 donne 0,850000000852), dans mon cas, j'ai juste besoin de 2 décimales pour les centimes d'argent.
J'avais du mal à trouver un moyen de séparer le montant en dollars et le montant après la virgule. Je pense que je l'ai surtout compris et j'ai pensé à partager si l'un d'entre vous avait des problèmes
Donc en gros...
si le prix est 1234,44 ... le tout serait 1234 et la décimale serait 44 ou
si le prix est 1234,01 ... le tout serait 1234 et le nombre décimal serait 01 ou
si le prix est 1234,10 ... le tout serait 1234 et la décimale serait 10
et ainsi de suite
$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;
Dans ce cas, obtenir à la fois $wholeAs?et$decimal ne dépend pas de l'autre. (Vous pouvez simplement prendre 1 des 3 sorties indépendamment.) J'ai montré $wholeAsFloatet $wholeAsIntparce quefloor() renvoie un nombre de type flottant même si le nombre qu'il renvoie sera toujours entier. (Ceci est important si vous transmettez le résultat dans un paramètre de fonction d'indication de type.)
Je voulais que cela divise un nombre d'heures / minutes à virgule flottante, par exemple 96,25, en heures et minutes séparément pour un instance de DateInterval en 96 heures 15 minutes. J'ai fait ceci comme suit:
split()
est obsolète.explode(".",1.10);
wil donnera 1 et 1, pas 1 et 10Réponses:
Puis comparez avec 1/4, 1/2, 3/4, etc.
En cas de nombres négatifs, utilisez ceci:
L'
$returnUnsigned
empêche de faire -1,25 po à -1 et -0,25la source
intval()
ou simple casting qui(int)
pourrait être plus performant quefloor()
Ce code le divisera pour vous:
où $ entier est le nombre entier et $ decimal aura les chiffres après la virgule décimale.
la source
explode(".",1.10);
wil donnera 1 et 1, pas 1 et 10Juste pour être différent :)
CodePad .
Comme avantage supplémentaire, il ne sera divisé que lorsque les deux côtés se composent de chiffres.
la source
La méthode floor () ne fonctionne pas pour les nombres négatifs. Cela fonctionne à chaque fois:
... fonctionne également pour les négatifs (même code, numéro différent):
la source
un chemin court (utilisez floor et fmod)
puis comparez $ decimal à 0, .25, .5 ou .75
la source
(a % 1)
ET il gère bien les nombres négatifs.Transformez-le en un entier et soustrayez-le
Ou juste pour obtenir la décimale à des fins de comparaison
la source
Il y a aussi une fonction fmod, qui peut être utilisée: fmod ($ my_var, 1) retournera le même résultat, mais parfois avec une petite erreur ronde.
la source
PHP 5.4+
la source
C'est la manière dont j'utilise:
la source
La méthode de Brad Christie est essentiellement correcte, mais elle peut être écrite de manière plus concise.
Ceci est équivalent à sa méthode mais plus court et, espérons-le, plus facile à comprendre.
la source
la source
Si vous pouvez vous attendre à ce qu'il ait toujours 2 décimales, vous pouvez simplement utiliser une opération de chaîne:
Aucune idée de performance mais pour mon cas simple c'était bien mieux ...
la source
Pour éviter la décimale flottante supplémentaire (c'est-à-dire 50,85 - 50 donne 0,850000000852), dans mon cas, j'ai juste besoin de 2 décimales pour les centimes d'argent.
la source
J'avais du mal à trouver un moyen de séparer le montant en dollars et le montant après la virgule. Je pense que je l'ai surtout compris et j'ai pensé à partager si l'un d'entre vous avait des problèmes
Donc en gros...
si le prix est 1234,44 ... le tout serait 1234 et la décimale serait 44 ou
si le prix est 1234,01 ... le tout serait 1234 et le nombre décimal serait 01 ou
si le prix est 1234,10 ... le tout serait 1234 et la décimale serait 10
et ainsi de suite
la source
Pas vu un simple module ici ...
Dans ce cas, obtenir à la fois
$wholeAs?
et$decimal
ne dépend pas de l'autre. (Vous pouvez simplement prendre 1 des 3 sorties indépendamment.) J'ai montré$wholeAsFloat
et$wholeAsInt
parce quefloor()
renvoie un nombre de type flottant même si le nombre qu'il renvoie sera toujours entier. (Ceci est important si vous transmettez le résultat dans un paramètre de fonction d'indication de type.)Je voulais que cela divise un nombre d'heures / minutes à virgule flottante, par exemple 96,25, en heures et minutes séparément pour un instance de DateInterval en 96 heures 15 minutes. J'ai fait ceci comme suit:
Je me fichais des secondes dans mon cas.
la source
la source