Comment puis-je imprimer un double de la valeur sans la notation scientifique à l'aide de Java?
Je veux imprimer un double de la valeur en Java sans forme exponentielle.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Il montre ce E notation: 1.2345678E7
.
Je veux l'imprimer comme ceci: 12345678
Quelle est la meilleure façon d'éviter cela?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
printf()
avec%f
:Cette impression sera
dexp: 12345678.000000
. Si vous ne voulez pas de la partie fractionnaire, utilisezIl utilise le spécificateur de format langue expliqué dans le la documentation.
La valeur par défaut
toString()
format utilisé dans votre code original est écrit ici.dexp: 12345681.000000
qui est une fausse valeur.Et en fait après je veux l'afficher sur ma page web où il affiche comme ceci1.2345678E7
.Est-il de toute façon à travers laquelle je peux le stocker dans le double comme12345678
et de toute autre manière?%.0f
.%.0f
arrondit le nombre. Est-il un moyen de simplement jeter les zéros de fin?Java empêcher E la notation en double:
Cinq différentes façons de convertir un double à un nombre normal:
Ce programme imprime:
Qui sont toutes de la même valeur.
Protip: Si vous êtes confus quant à pourquoi ces chiffres aléatoires apparaissent au-delà d'un certain seuil dans le double de la valeur, cette vidéo explique: computerphile pourquoi ne
0.1
+0.2
l'égalité des0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
En bref:
Si vous voulez vous débarrasser de zéros et les paramètres Régionaux des problèmes, alors vous devriez utiliser:
Explication:
Pourquoi les autres réponses ne me convient pas:
Double.toString()
ouSystem.out.println
ouFloatingDecimal.toJavaFormatString
utilise scientifique notations si un double est inférieur à 10^-3 ou supérieure ou égale à 10^7En utilisant
%f
, la valeur par défaut, la précision décimale est de 6, sinon, vous pouvez coder en dur, mais il en résulte supplémentaire ajouter des zéros si vous avez moins de décimales. Exemple:En utilisant
setMaximumFractionDigits(0);
ou%.0f
vous supprimez toute la précision décimale, ce qui est bien pour les entiers/longs, mais pas pour le double:En utilisant DecimalFormat, vous êtes locales dépendantes. Dans les paramètres régionaux français, le séparateur décimal est une virgule, pas un point:
En utilisant les paramètres régionaux ANGLAIS vous permet d'obtenir un point pour le séparateur décimal, où que votre programme s'exécute.
Pourquoi à l'aide de 340 puis pour
setMaximumFractionDigits
?Deux raisons:
setMaximumFractionDigits
accepte un entier, mais sa mise en œuvre a un maximum de chiffres permis deDecimalFormat.DOUBLE_FRACTION_DIGITS
ce qui équivaut à 340Double.MIN_VALUE = 4.9E-324
donc, avec 340 chiffres, vous êtes sûr de ne pas faire le tour de votre double et une perte de précision.new BigDecimal(myvalue).toPlainString()
à Partir de la description docs.oracle.com/javase/7/docs/api/java/math/...), il n'est pas immédiatement évident de savoir comment il se comporte quand étant donné les différents types de nombres, mais il ne fait éliminer de la notation scientifique.new BigDecimal(0.00000021d).toPlainString()
sortie0.0000002100000000000000010850153241148685623329583904705941677093505859375
qui n'est pas ce que vous attendez ...Vous pouvez essayer avec
DecimalFormat
. Avec cette classe, vous êtes très flexible dans l'analyse de vos numéros.Vous pouvez définir exactement le modèle que vous souhaitez utiliser.
Dans votre cas, par exemple:
J'en ai une autre solution impliquant BigDecimal de toPlainString(), mais cette fois à l'aide de la Chaîne-constructeur, ce qui est recommandé dans la javadoc:
Il ressemble dans sa forme la plus courte:
Avant Java 8, il en résulte "0.0" pour toute valeur zéro est doublé, de sorte que vous devez ajouter:
NaN et infini de valeurs doivent être vérifiés supplémentaire.
Le résultat final de toutes ces considérations:
Cela peut aussi être copié/collé de travailler bien avec Flotteur.
d.doubleValue() == 0
au lieu ded == 0
?Cela fonctionnera aussi longtemps que votre numéro est un nombre entier:
Si la variable de type double dispose de précision après la virgule, il va tronquer.
J'avais besoin de convertir une sorte de double de la valeur des devises et constaté que la plupart des solutions ont été OK, mais pas pour moi.
La
DecimalFormat
a finalement été le moyen pour moi, c'est ce que j'ai fait:Comme vous pouvez le voir, si le nombre est naturel je obtenir - dire - 20000000 au lieu de 2E7 (etc.) - sans point décimal.
Et si c'est décimal, je ne reçois que deux chiffres après la virgule.
Java/Kotlin compilateur convertit toute valeur supérieure à 9999999 (supérieur ou égal à 10 millions de dollars) à la notation scientifique ie. Epsilion notation.
Ex: 12345678 est converti à 1.2345678E7
Utiliser ce code pour éviter de conversion automatique en notation scientifique:
Le code suivant détecte si le nombre est présenté en notation scientifique. Si donc il est représenté dans la présentation normale avec un maximum de " 25 de chiffres.
Je pense que tout le monde a eu la bonne idée, mais toutes les réponses n'ont pas été simples.
Je peux voir ce qui est très utile morceau de code. Voici un extrait de ce que sera le travail:
la
".8"
vous permet de définir le nombre de décimales que vous souhaitez afficher.Je suis en utilisant Eclipse et cela a fonctionné sans problème.
Espère que cela a été utile. J'apprécie tous vos commentaires!
J'ai eu ce même problème dans mon code quand je l'utilise comme une entrée de chaîne de maths.Eval() fonction qui prend une chaîne de caractères comme "x + 20 /50"
J'ai regardé des centaines d'articles... À la fin, je suis allé avec cela à cause de la vitesse. Et parce que la fonction Eval allait se reconvertir dans son propre format de nombre par la suite et en mathématiques.Eval() ne prend pas en charge la fuite d'E-07 que d'autres méthodes sont retournés, et rien de plus de 5 dp a trop de détails pour que ma demande de toute façon.
C'est maintenant utilisé dans la production de code pour une application qui a plus de 1000 utilisateurs...
Pour les valeurs entières représenté par un
double
, vous pouvez utiliser ce code, qui est beaucoup plus rapide que les autres solutions.Ma solution:
String str = String.format ("%.0f", yourDouble);