Supprimer les chiffres après la deuxième décimale, sans arrondir la valeur
je avoir une valeur dans la variable php comme ça
$var='2.500000550';
echo $var
ce que je veux, c'est de supprimer tous les points décimaux après 2 chiffres.
comme maintenant la valeur de la variable sera
$var='2.50';
echo $var
garder à l'esprit cette valeur est à venir à partir de base de données mysql
mais quand j'utilise round php function
je suis ronde, mais je n'ai pas besoin ronde, j'ai juste besoin de supprimer tous les chiffres après la décimale 2 simple.
j'ai fatigué, flot()
et beaucoup d'autre option, sans succès.
Grâce
- avez-vous essayé number_format?
- Il n'est pas explicitement documentées, mais number_format tours.
Vous devez vous connecter pour publier un commentaire.
TL;DR:
La fonction native de PHP bcdiv semble faire précisément ce qui est nécessaire, et correctement.
Simplement "tronquer" un certain nombre,
bcdiv($var, 1, 2);
où 2 est le nombre de décimales à préserver (et 1 est la denomenator - diviser le nombre par 1 vous permet de simplement couper l'origine nombre souhaité de décimales)Réponse complète (pour l'histoire)
Cela s'avère plus difficile qu'on pourrait le penser.
Après cette réponse a été (à tort) upvoted un peu, il est venu à mon attention que même sprintf rond.
Plutôt que de supprimer cette réponse, je suis en le transformant en un plus robuste explication /discussion de chaque solution proposée.
number_format - Incorrect. (tours)
Essayez d'utiliser format de nombre:
Si vous voulez qu'il soit un nombre, puis tapez simplement en fonte pour un float:
Remarque: comme cela a été souligné dans les commentaires, cela n'en fait ronde le nombre.
sprintf - incorrect. (sprintf aussi des tours)
Si pas en arrondissant ce nombre est important, puis par la réponse ci-dessous, utilisez sprintf:
étage - pas tout à fait! (étage des tours des nombres négatifs)
étage, avec quelques calculs, viendra près de faire ce que vous voulez:
Où 100 représente la précision que vous voulez. Si vous le voulais à trois chiffres, puis:
Cependant, cela a un problème avec les nombres négatifs. Les nombres négatifs toujours obtenir arrondie, plutôt que tronquée:
"Vieux" réponse Correcte: la fonction en utilisant étage
Donc pleinement solution robuste nécessite une fonction:
Les résultats de la fonction ci-dessus:
Nouvelle Réponse Correcte
Utiliser la fonction native de PHP bcdiv
sprintf("%01.2f", 2.509) != '2.50'
. -1 désolé.floor
a un problème avec les nombres négatifs, ce n'est pas correct. Astuce sympa!bcdiv
if ( 0 == (int)$number ) { return $number; }
Devrait êtreif ( (int)$number == 0 ) { return $number; }
Juste un peu en arrière. Merci pour la fonction.=
symboles dans votre code, vous obtenez une involontaire de la cession de0
à la$number
variable. Si vous oubliez l'un des=
symboles dans mon code, vous obtenez un message d'erreur, et le PHP ne s'exécute pas.bcdiv(0.20198302, 1, 2)
garder à l'esprit ceci:0.20
sera montré comme0.2
.bcdiv
, ce qui est en haut et en bas de mon post, c'est la bonne réponse.Ceci devrait faire votre tâche...
Vous demandez une fonction qui renvoie
"2.50"
et pas2.5
, donc vous ne parlons pas de l'arithmétique ici, mais de manipulation de chaîne. Puispreg_replace
est votre ami:Si vous voulez le faire avec l'arithmétique, il suffit d'utiliser:
'intval(2.092484 * 100) / 100' is
2.09", mais je pense que l'utilisationround
au lieu deintval
devraient en faire plus à l'épreuve des balles. Merci!essayer avec number_format:
utilisation sprintf
$var == 2.509
puis la ci-dessus sera de retour 2.51, pas de 2,50. Donc, ne pas répondre à la question explicitement les états à "ne pas rond".number_format arrondit le nombre
J'ai utilisé preg_replace pour vraiment couper la corde
quelqu'un a posté ici sur
donc dans leur forme brute, ne pas l'utiliser...
Mais si vous ajoutez un peu d'epsilon...
ça marche!!!
floor(205)
est de retour 204 ici, peut être trouvé à l'adresse php.net/manual/en/function.floor.php#114204Utiliser la fonction native de PHP bcdiv.
Exemple:
Pour votre cas:
Toutes les solutions qui utilisent le number_format sont mauvais parce que number_format effectue l'arrondissement.
La fonction ci-dessous devrait fonctionner sur tous les numéros, vous pouvez spécifier le séparateur décimal pour les pays qui utilisent des ','.
Suivantes est (ce que je crois - s'il vous plaît corrigez-moi si non) d'un solide mathématique* solution, basée principalement sur l'information à partir de plusieurs autres answerers ici, et une petite quantité de me
(*Ce qui n'est pas de suggérer qu'il y a quelque chose de mal avec Liphtier de la regex de réponse - juste que je ne peux voir les puristes qui veulent éviter les regex pour ce qui est sans doute un problème mathématique.)
sprintf()
,number_format()
(etround()
, évidemment), sont tous de l'exécution d'une opération d'arrondi ne sont donc pas appropriés pour les non-arrondi troncature demandée dans la question (pas sur leur propre, au moins).pow()
pour obtenir le droit facteur basé sur une précision spécifiée).floor()
(ou probablementceil()
) peut produire des résultats inattendus pour les négatifs, sans l'utilisation deabs()
.abs()
pour obtenir une négation du facteur, nous avons besoin de compte pour le cas lorsque l'entrée est de 0.Le code que j'utilise est:
Une fonction simple à suivre serait "Si elle est supérieure à 0 étage, d'autre ceil", à l'aide d'un multiplicateur pour l'élever au-dessus du point décimal temporairement alors que faire:
Une solution possible à partir de cale_b réponse.
Positif
Négatif