Le formatage d'un nombre à deux décimales en JavaScript
J'ai cette ligne de code qui arrondit mes numéros à deux chiffres après la virgule. Mais j'obtiens des chiffres comme ceci: 10.8, 2.4, etc. Ce ne sont pas de mon idée de deux décimales, donc comment je peux améliorer le suivant?
Math.round(price*Math.pow(10,2))/Math.pow(10,2);
Je veux des chiffres comme 10.80, 2.40, etc. Utilisation de jQuery est bien avec moi.
- Votre code est exactement ce que je cherchais(pour réduire la précision à 7 décimales pour les petits fichier JSON) en Sautant de Mathématiques.pow pour la vitesse val = Math.round(val * 10000000) / 10000000);
- Comme le actuellement accepté de répondre donne sans doute un mauvais résultat pour un large éventail de valeurs grâce à l'aggravation de l'imprécision inhérente à l'numéros (
0.565
,0.575
,1.005
), puis-je suggérer à la recherche de nouveau sur cette réponse, qui obtient les corriger? - Peut-être que vous souhaitez inclure un sprintf bibliothèque JavaScript stackoverflow.com/questions/610406/...
- Après avoir correctement arrondi à la décimale de déplacement et de la méthode d'arrondi, vous pouvez utiliser le
number.toFixed(x)
méthode pour convertir une chaîne de caractères avec la quantité requise de zéros. E. g. tour1.34
à1.3
avec la croix-navigateur méthode, puis ajouter 1 zéro et de le convertir en chaîne de caractères avec1.3.toFixed(2)
(pour obtenir"1.30"
).
Vous devez vous connecter pour publier un commentaire.
Pour formater un nombre à l'aide de la notation à virgule fixe, vous pouvez simplement utiliser la toFixed méthode:
Noter que
toFixed()
retourne une chaîne de caractères.IMPORTANT: Notez que toFixed n'a pas fait ronde, 90% du temps, il sera de retour la valeur arrondie mais pour de nombreux cas, il ne fait pas travailler. Essayez ceci dans la console:
2.005.toFixed(2)
Vous obtiendrez la mauvaise réponse
Il n'existe aucun moyen naturel de l'obtention d'un décimal arrondi en javascript, vous aurez besoin de votre propre polyfill ou l'utilisation d'une bibliothèque. Vous pouvez regarder mozilla polyfill pour cette https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
(0.09).toFixed(1);
donne 0.0 dans IE8Math.Round(0.09)
sera de retour0
ce sera toujours donner0.0
...(0.19).toFixed(1)
donne un résultat de0.2
Math.round(value*100)/100
fonctionne le mieux pour 2DP..toFixed
n'est pas toujours fiable lorsque l'on parle de précision. Par exemple,1.345.toFixed(2)
donne un résultat de"1.34"
qui n'est pas correct. Une meilleure façon de le faire est parMath.round(1.345*100)/100 //1.35
.C'est un vieux sujet, mais toujours en tête du classement des résultats de Google et les solutions proposées, de partager le même point flottant décimales question. Voici la (très générique) fonction que j'utilise, grâce à la MDN:
Comme nous pouvons le voir, nous n'avons pas ces problèmes:
Ce genericity fournit également des trucs cool:
Maintenant, pour répondre à l'OP de la question, on a pour type:
Ou, pour un plus concis, moins de la fonction générique:
Vous pouvez l'appeler avec:
Divers exemples et tests (merci à @t-j-crowder!):
JS:
CSS:
HTML:
J'ai l'habitude de l'ajouter à ma bibliothèque personnelle, et après quelques suggestions et de l'aide de l' @TIMINeutron solution de trop, et de le rendre adaptable pour les décimales de la longueur puis, celui-ci s'adapte le mieux:
de travail pour les exceptions signalées.
toFixed(...)
devrait êtredecimals
, comme dans le réponse par @TIMINeutronJe ne sais pas pourquoi je ne peux pas ajouter un commentaire à une précédente réponse (peut-être que je suis désespérément à l'aveugle, je ne sais pas), mais j'ai trouvé une solution en utilisant @Miguel de réponse:
Et ses deux commentaires (à partir de @bighostkim et @Imre):
precise_round(1.275,2)
pas de retour 1.28precise_round(6,2)
de ne pas retourner au moins 6,00 (comme il le voulait).Ma solution finale est comme suit:
Comme vous pouvez le voir j'ai dû ajouter un peu de "correction" (ce n'est pas ce qu'il est, mais depuis les Mathématiques.tour entraîne une perte - vous pouvez le vérifier sur jsfiddle.net - c'est la seule façon que je savais comment "réparer"). Il ajoute 0,001 à la déjà collier de nombre, il est l'ajout d'un
1
trois0
s à la droite de la valeur décimale. Donc il devrait être sûr d'utiliser.Après que j'ai ajouté
.toFixed(decimal)
toujours de sortie, le nombre dans le format correct (avec la bonne quantité de décimales).Donc c'est assez bien. Il faut bien l'utiliser 😉
EDIT: ajout de la fonctionnalité de la "correction" des nombres négatifs.
precise_round(1.27499,2)
maintenant retourne également 1.28... Ce n'est pasMath.round
qui est incomplet; le fait que les ordinateurs interne de stocker des valeurs à virgule flottante est. Fondamentalement, vous êtes voué à l'échec avec certaines valeurs avant que les données encore à votre fonction 🙂Une façon de être sûr à 100% que vous obtenez un nombre à 2 décimales:
Si cela provoque des erreurs d'arrondi, vous pouvez utiliser ce qui suit comme Jacques l'a expliqué dans son commentaire:
var answer = (Math.round((num * 1000)/10)/100).toFixed(2);
Utiliser cette méthode ci-dessous
ET si vous voulez que le nombre fixé utilisation
Je n'ai pas trouver une solution exacte à ce problème, j'ai donc créé mon propre:
Exemples:
JS:
@heridev et j'ai créé une petite fonction en jQuery.
Vous pouvez essayer la prochaine:
HTML
jQuery
DÉMO EN LIGNE:
http://jsfiddle.net/c4Wqn/
input
événement. Ce n'est pas de créer un effet scintillant et aussi se déclenche lorsque vous accédez au champ avec JSVoici un simple
Utiliser comme
alert(roundFloat(1.79209243929,4));
Jsfiddle
Le problème avec les valeurs à virgule flottante, c'est qu'ils sont en essayant de représenter une quantité infinie de (continue) des valeurs avec un montant fixe de bits. Alors, naturellement, il doit y avoir une certaine perte dans le jeu, et vous allez être mordu avec certaines valeurs.
Lorsqu'un ordinateur stocke 1.275 comme une valeur en virgule flottante, il ne sera pas réellement se souvenir si c'était 1.275 ou 1.27499999999999993, ou même 1.27500000000000002. Ces valeurs doivent donner des résultats différents en arrondissant à deux décimales, mais ils ne le seront pas, car pour l'ordinateur, ils regardent exactement la même après leur stockage sous forme de valeurs à virgule flottante, et il n'y a aucun moyen de restaurer les données perdues. Toutes les autres calculs ne s'accumuler une telle imprécision.
Donc, si la précision des questions, vous devez éviter les valeurs à virgule flottante à partir du début. Options les plus simples sont à
Par exemple, lors de l'utilisation de nombres entiers pour stocker le nombre de centièmes de seconde, la fonction pour trouver la valeur réelle est assez simple:
Avec des chaînes, vous aurez besoin d'arrondi, mais c'est encore gérable:
Noter que cette fonction arrondit la plus proche, liens éloigne de zéro, tandis que La norme IEEE 754 recommande d'arrondi au plus près, liens à même que le comportement par défaut pour les opérations à virgule flottante. De telles modifications sont laissé comme exercice pour le lecteur 🙂
Le tour de votre valeur décimale, puis utilisez
toFixed(x)
pour votre chiffre(s).Appel
parseDecimalRoundAndFixed(10.800243929,4) => 10.80
parseDecimalRoundAndFixed(10.807243929,2) => 10.81
JS:
Voici mon 1 solution en ligne:
Number((yourNumericValueHere).toFixed(2));
Voici ce qui arrive:
1) tout d'Abord, vous appliquez
.toFixed(2)
sur le nombre que vous voulez arrondir les décimales de. Notez que cela va convertir la valeur d'une chaîne de caractères à partir du numéro. Donc, si vous utilisez la Machine, il renvoie une erreur comme ceci:"Type" chaîne "n'est pas cessible de type "nombre","
2) Pour revenir à la valeur numérique ou de convertir la chaîne de valeur numérique, il suffit d'appliquer la
Number()
fonction sur cette soi-disant " chaîne de valeur.Pour plus de précisions, regardez l'exemple ci-dessous:
EXEMPLE:
J'ai un montant de jusqu'à 5 chiffres dans le nombre de décimales et je voudrais raccourcir jusqu'à 2 décimales. Je ne l'aime tellement:
JS:
Mettre suivantes dans certains étendue globale:
et puis essayez:
Mise à jour
Noter que
toFixed()
ne peuvent travailler que pour le nombre de décimales entre0-20
c'est à direa.getDecimals(25)
peut générer une erreur de javascript, de sorte à prendre en compte que vous pouvez ajouter un peu de vérification supplémentaire c'est à direcela renvoie un nombre aléatoire de 1 à 100 arrondie à 2 décimales.
Cela a fonctionné pour moi: L'arrondissement des Décimales en JavaScript
L'aide de cette réponse par la référence: https://stackoverflow.com/a/21029698/454827
Je construire une fonction pour trouver les nombres de décimales:
ici de travail exemple: https://jsfiddle.net/wpxLduLc/
JS:
HTML:
Ronde
Round up
Tour la plus proche
Avec ces exemples, vous obtiendrez toujours une erreur lorsque vous essayez d'arrondir le nombre 1.005 la solution consiste à utiliser une bibliothèque comme Math.js ou cette fonction:
J'ai quelques idées de ce post il y a quelques mois, mais aucune des réponses ici, ni des réponses des autres articles/blogs pourrait gérer tous les scénarios (par exemple, les nombres négatifs, ainsi que quelques numéros de la chance" notre testeur trouvé). En fin de compte, notre testeur n'a trouvé aucun problème avec cette méthode ci-dessous. Coller un extrait de mon code:
J'ai aussi des commentaires de code (désolé j'ai oublié tous les détails déjà)...je poste ma réponse ici pour référence future:
Simple que cela.
Je suis résoudre le problème de la modification.
2 décimales seulement.
JS:
HTML:
Qui devrait donner:
10.20
Qui devrait donner:
0.05
Qui devrait donner:
4.04
etc.
JS:
C'est très simple et fonctionne tout aussi bien que les autres:
Depuis toFixed() peut être appelée uniquement sur les nombres, et, malheureusement, renvoie une chaîne, cela ne l'analyse pour vous dans les deux directions. Vous pouvez passer une chaîne de caractères ou un nombre, et vous obtenez un numéro de retour à chaque fois! L'appel de parseNumber(1.49) vous donnera 1, et parseNumber(1.49,2) vous donnera 1.50. Tout comme les meilleurs de l'em!
Vous pouvez également utiliser la
.toPrecision()
méthode et un peu de code personnalisé, et toujours en rond, jusqu'à la n-ième décimale quelle que soit la longueur de la partie int.Vous pouvez aussi en faire un plugin pour une meilleure utilisation.
J'ai trouvé un moyen très simple qui a résolu ce problème pour moi et peut être utilisé ou adapté:
100% de travail!!! Essayez