Je veux imprimer une double valeur en Java sans forme exponentielle.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Il montre cette notation E: 1.2345678E7
.
Je veux l'imprimer comme ceci: 12345678
Quelle est la meilleure façon d'empêcher cela?
dexp: 12345681.000000
quelle est la mauvaise valeur. Et en fait après cela, je veux l'afficher sur ma page Web où il s'affiche comme ceci.1.2345678E7
Y a-t-il de toute façon à travers lequel je peux le stocker dans n'importe quel double comme12345678
et de toute autre manière?%.0f
.%.0f
arrondit le nombre. Existe-t-il un moyen de simplement supprimer les zéros de fin?Java empêche la notation E dans un double:
Cinq façons différentes de convertir un double en nombre normal:
Ce programme imprime:
Qui ont tous la même valeur.
Protip: Si vous ne savez pas pourquoi ces chiffres aléatoires apparaissent au-delà d'un certain seuil dans la valeur double, cette vidéo explique: computerphile pourquoi
0.1
+ est-il0.2
égal0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
la source
En bref:
Si vous souhaitez vous débarrasser des zéros de fin et des problèmes de paramètres régionaux, vous devez utiliser:
Explication:
Pourquoi les autres réponses ne me convenaient pas:
Double.toString()
ouSystem.out.println
ouFloatingDecimal.toJavaFormatString
utilise des notations scientifiques si le double est inférieur à 10 ^ -3 ou supérieur ou égal à 10 ^ 7En utilisant
%f
, la précision décimale par défaut est 6, sinon vous pouvez la coder en dur, mais elle entraîne des zéros supplémentaires ajoutés si vous avez moins de décimales. Exemple:En utilisant
setMaximumFractionDigits(0);
ou%.0f
vous supprimez toute précision décimale, ce qui est bien pour les entiers / longs, mais pas pour le double:En utilisant DecimalFormat, vous dépendez localement. Dans les paramètres régionaux français, le séparateur décimal est une virgule, pas un point:
L'utilisation des paramètres régionaux ANGLAIS garantit que vous obtenez un point pour le séparateur décimal, où que votre programme s'exécute.
Pourquoi utiliser 340 alors
setMaximumFractionDigits
?Deux raisons:
setMaximumFractionDigits
accepte un entier, mais son implémentation a un maximum de chiffres autorisésDecimalFormat.DOUBLE_FRACTION_DIGITS
dont 340Double.MIN_VALUE = 4.9E-324
Ainsi, avec 340 chiffres, vous êtes sûr de ne pas arrondir votre double et de perdre en précision.la source
new BigDecimal(myvalue).toPlainString()
la description à docs.oracle.com/javase/7/docs/api/java/math/… ), il n'est pas immédiatement évident comment il se comporte lorsqu'il est donné différents types de nombres, mais il élimine la notation scientifique .new BigDecimal(0.00000021d).toPlainString()
sortie0.0000002100000000000000010850153241148685623329583904705941677093505859375
qui n'est pas ce que vous attendez ...BigDecimal.valueOf(0.00000021d).toPlainString()
fonctionne aussi (il utilise le constructeur String de BigDecimal c'est pourquoi)Vous pouvez l'essayer avec
DecimalFormat
. Avec cette classe, vous êtes très flexible dans l'analyse de vos numéros.Vous pouvez définir exactement le motif que vous souhaitez utiliser.
Dans votre cas par exemple:
la source
J'ai une autre solution impliquant toPlainString () de BigDecimal, mais cette fois en utilisant le constructeur de chaîne, qui est recommandé dans le javadoc:
Il ressemble à ceci sous sa forme la plus courte:
Avant Java 8, cela se traduit par «0,0» pour tous les doubles à valeur nulle, vous devez donc ajouter:
Les valeurs NaN et infinies doivent être vérifiées en plus.
Le résultat final de toutes ces considérations:
Cela peut également être copié / collé pour fonctionner correctement avec Float.
la source
d.doubleValue() == 0
au lieu ded == 0
?Cela fonctionnera tant que votre numéro est un nombre entier:
Si la variable double a une précision après le point décimal, elle la tronquera.
la source
J'ai dû convertir des valeurs doubles en devises et j'ai constaté que la plupart des solutions étaient correctes, mais pas pour moi.
Le
DecimalFormat
fut finalement le chemin pour moi, alors voici ce que je l' ai fait:Comme vous pouvez le voir, si le nombre est naturel, je reçois - disons - 20000000 au lieu de 2E7 (etc.) - sans point décimal.
Et si c'est décimal, je n'ai que deux chiffres décimaux.
la source
Le compilateur Java / Kotlin convertit toute valeur supérieure à 9999999 (supérieure ou égale à 10 millions) en notation scientifique, c'est-à-dire. Notation Epsilion .
Ex: 12345678 est converti en 1.2345678E7
Utilisez ce code pour éviter la conversion automatique en notation scientifique:
la source
Le code suivant détecte si le nombre fourni est présenté en notation scientifique. Si tel est le cas, il est représenté dans une présentation normale avec un maximum de «25» chiffres.
la source
Je pense que tout le monde avait la bonne idée, mais toutes les réponses n'étaient pas simples. Je peux voir que c'est un morceau de code très utile. Voici un extrait de ce qui fonctionnera:
l'
".8"
est où vous définissez le nombre de décimales que vous souhaitez afficher.J'utilise Eclipse et cela n'a pas fonctionné.
J'espère que cela vous a été utile. J'apprécierais toute rétroaction!
la source
J'ai eu ce même problème dans mon code de production lorsque je l'utilisais comme entrée de chaîne dans une fonction math.Eval () qui prend une chaîne comme "x + 20/50"
J'ai regardé des centaines d'articles ... Au final, je suis allé avec ça à cause de la vitesse. Et parce que la fonction Eval allait finalement la reconvertir dans son propre format numérique et math.Eval () ne supportait pas le E-07 final que les autres méthodes renvoyaient, et tout ce qui dépassait 5 dp était de toute façon trop détaillé pour mon application .
Ceci est maintenant utilisé dans le code de production pour une application qui compte plus de 1000 utilisateurs ...
la source
Cela peut être une tangente .... mais si vous avez besoin de mettre une valeur numérique sous forme d'entier (qui est trop grand pour être un entier) dans un sérialiseur (JSON, etc.) alors vous voudrez probablement "BigInterger"
Exemple: la valeur est une chaîne - 7515904334
Nous devons le représenter sous forme numérique dans un message Json: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "SOME CORPORATION"}
Nous ne pouvons pas l'imprimer ou nous obtiendrons ceci: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "SOME CORPORATION"}
L'ajout de la valeur au nœud comme ceci produit le résultat souhaité: BigInteger.valueOf (Long.parseLong (value, 10))
Je ne suis pas sûr que ce soit vraiment sur le sujet, mais comme cette question a été mon principal succès lorsque j'ai cherché ma solution, j'ai pensé partager ici pour le bénéfice des autres, mentez-moi, qui cherche mal. :RÉ
la source
Pour les valeurs entières représentées par un
double
, vous pouvez utiliser ce code, qui est beaucoup plus rapide que les autres solutions.la source
Ma solution: String str = String.format ("% .0f", yourDouble);
la source