Question

Quel type de données est susceptible de représenter un nombre décimal tel que "10364055.81".

Si vous avez essayé d'utiliser double:

double d = 10364055.81;

Mais lorsque j'essaie d'imprimer le numéro, il affiche le symbole " 1.036405581E7 ", ce que je ne souhaite pas.

Devrais-je utiliser BigDecimal? Mais son affichage est 10364055.81000000052154064178466796875 . Existe-t-il un type de données affichant les valeurs telles quelles? Le nombre peut également être supérieur à celui pris à titre d'exemple.

BTW, l’utilisation de BigDecimal affectera-t-elle les performances de l’application ?? Je pourrais l’utiliser dans presque tous mes DTO.

Était-ce utile?

La solution

Vous devez utiliser BigDecimal - mais utiliser le constructeur String , par exemple:

.
new BigDecimal("10364055.81");

Si vous passez un double à BigDecimal, Java doit d'abord créer ce double - et comme les doubles ne peuvent pas représenter avec précision la plupart des fractions décimales, il crée la valeur sous la forme 10364055.81000000052154064178466796875 et then le transmet au constructeur BigDecimal. Dans ce cas, BigDecimal n’a aucun moyen de savoir que vous parliez réellement de la version la plus ronde.

De manière générale, l'utilisation de constructeurs non-String de BigDecimal doit être considérée comme un avertissement indiquant que vous ne tirez pas pleinement parti de la classe.

Modifier : après avoir relu exactement ce que vous vouliez faire, ma revendication initiale est probablement trop forte. BigDecimal est un bon choix lorsque vous devez représenter exactement les valeurs décimales (la gestion de l'argent étant un choix évident, vous ne voulez pas que 5.99 * un million soit 5990016.45 par exemple.

Mais si vous n'êtes pas inquiet à propos du nombre stocké en interne en tant que valeur très légèrement différente du littéral décimal que vous avez entré et que vous souhaitez simplement le réimprimer dans le même format, alors comme d'autres l'ont déjà dit, une instance de NumberFormat (dans ce cas, new DecimalFormat ("########. ##") ) fera l'astuce pour sortir le double bien, ou String.format peut faire à peu près la même chose.

En ce qui concerne les performances - BigDecimals sera naturellement plus lent que l’utilisation de primitives. En règle générale, cependant, à moins que la grande majorité de votre programme ne comporte des manipulations mathématiques, vous ne remarquerez probablement aucune différence de vitesse. Cela ne veut pas dire que vous devriez utiliser BigDecimals partout; mais plutôt, si vous pouvez obtenir un réel avantage de leurs fonctionnalités qu'il serait difficile voire impossible de réaliser avec des doublons simples, alors ne transpirez pas la différence de performances minuscule qu'ils introduisent théoriquement.

Autres conseils

La manière dont un numéro est affiché est distincte de la manière dont le numéro est stocké.

Consultez DecimalFormat pour contrôler la manière dont vous pouvez afficher vos numéros lorsqu’un double (ou un flottant, etc.).

Notez que choisir BigDecimal plutôt que double (ou vice versa) a des avantages / inconvénients et dépendra de vos besoins. Voir ici pour plus d'informations. À partir du résumé:

  

En résumé, si performances brutes et   l'espace sont les facteurs les plus importants,   Les types primitifs à virgule flottante sont   approprié. Si les valeurs décimales doivent   être représenté exactement, haute précision   le calcul est nécessaire, ou un contrôle fin   d'arrondir est souhaité, seulement   BigDecimal a le nécessaire   capacités.

Un double suffirait pour enregistrer ce nombre. Si votre problème est que vous n'aimez pas le format lors de l'impression ou de l'insertion dans une chaîne, vous pouvez utiliser NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html

vous pouvez utiliser double et afficher if avec System.out.printf ().

double d = 100003.81;
System.out.printf("%.10f", d);

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top