8
votes

Type de données pour représenter une grande décimale en Java

Quel type de données est apte à représenter un nombre décimal comme "10364055.81".

Si essayé en utilisant double: xxx

mais quand j'essaie d'imprimer le nombre, Son affichage comme " 1,036405581e7 ", que je ne veux pas.

devrais-je utiliser BigDecimal? Mais son affichage comme 10364055.810000000521540641784666796875 . Existe-t-il un type de données qui affiche les valeurs telles que c'est? De plus, le nombre peut être plus grand que celui pris à titre d'exemple.

BTW, utilisera un effet bigdecimal la performance de l'application ?? Je pourrais l'utiliser dans presque tous mes DTO.


0 commentaires

4 Réponses :


4
votes

Comment un numéro est affiché est distinct de la manière dont le numéro est stocké.

Jetez un coup d'œil à décimalformat Pour contrôler la manière dont vous pouvez afficher vos chiffres lorsqu'un double (ou un flotteur, etc.).

Notez que choisir BigDecimal sur Double (ou inversement) a des avantages / contre et dépendra de vos besoins. Voir Voici pour plus d'informations. Du résumé:

en résumé, si performance brute et l'espace sont les facteurs les plus importants, Les types de points flottants primitifs sont approprié. Si les valeurs décimales doivent être représenté exactement, haute précision le calcul est nécessaire, ou contrôle fin de l'arrondi est souhaité, seulement BigDecimal a le besoin Capacités.


0 commentaires

19
votes

Vous devez utiliser BigDecimal - mais utiliser le constructeur de chaînes , par exemple: xxx

si vous passez un double à bigdecimal, Java Doit créer ce double premier - et puisque les doubles ne peuvent pas représenter la plupart des fractions décimales avec précision, il est-ce que crée la valeur comme 10364055.8100000005215406875 et puis le transmet à la Constructeur bigdecimal. Dans ce cas, BigDecimal n'a aucun moyen de savoir que vous vouliez réellement dire la version du rondeur.

En règle générale, l'utilisation de constructeurs non stricts de BigDecimal devrait être considéré comme un avertissement que vous n'obtenez pas le plein bénéfice de la classe.

EDIT - basé sur la relecture exactement ce que vous vouliez faire, ma demande initiale est probablement trop forte. BigDecimal est un bon choix lorsque vous devez représenter des valeurs décimales exactement (la manutention de l'argent étant le choix évident, vous ne voulez pas 599 * un million d'être 5990016.45 par exemple.

Mais si vous n'êtes pas inquiet du nombre étant stocké en interne comme une valeur très légèrement différente du littéral décimal que vous avez entré et que vous souhaitez simplement l'imprimer à nouveau dans le même format, alors que d'autres ont dit, une instance de numberFormat (dans ce cas, nouvelle décimalformat ("########. ##") ) fera le truc pour sortir le Double bien, ou string.format peut faire beaucoup la même chose.

quant à la performance - les bigdecimaux seront naturellement plus lents que d'utiliser des primitives. Typiquement, si la grande majorité de votre programme implique des manipulations mathématiques, il est peu probable que remarquez toute différence de vitesse. Cela ne veut pas dire que vous devriez vous devoir SE BigDecimals partout; mais plutôt que si vous pouvez avoir un réel avantage de leurs caractéristiques qui seraient difficiles ou impossibles à réaliser avec un double double , alors ne transpirez pas la différence de performance minuscule qu'ils introduisent théoriquement.


1 commentaires

Eh bien, je pense que tu as raison. Mais un double type de données doit suffire à ce nombre (seulement deux décimales). En utilisant un bigdecimal où un double suffit peut causer une faible performance lors de certaines opérations.




1
votes

Vous pouvez utiliser double et afficher si avec system.out.printf (). xxx

.10f - signifie un double avec précision de 10


0 commentaires