[JAVA] BigDecimal.valueOf (double) histoire

Fraction en grand décimal

Big Decimal est la norme de facto pour les calculs décimaux en java. Si vous essayez de calculer avec le type double ou le type flottant, une erreur se produira en un clin d'œil et ce sera terrible.

De plus, ce Big Decimal est susceptible d'être le plus utilisé par les nouveaux arrivants en raison de sa mauvaise nature. Si vous écrivez le code suivant, vous vous retrouverez avec une erreur. Puisqu'il y a une erreur lors de sa déclaration en tant que type double, En effet, même si vous créez une grande décimale en fonction de celle-ci, l'erreur sera conservée telle quelle. Quand j'étais un nouveau venu, mes aînés m'ont poussé à écrire comme ci-dessous.


BigDecimal bad = new BigDecimal(1.3);
//En interne 1.3000000000000000444089209850062616169452667236328125

BigDecimal good = new BigDecimal("1.3");

BigDecimal.valueOf(double) Ainsi, lorsqu'il s'agit de fractions dans BigDecimal, l'argument est une chaîne de caractères et il imprègne complètement le corps. Quand j'ai cherché un peu récemment, il y avait pas mal de pages d'explications qui disaient que BigDecimal.valueOf (double) peut gérer le double type sans aucun problème.

Cependant, étant donné que new BigDecimal (double) '' ne peut pas contenir une fraction décimale exacte au moment du type double, une erreur se produira. BigDecimal.valueOf (double) '' devrait également être inexact.

Mais, étonnamment, dans la plupart des cas, `` BigDecimal.valueOf (double) '' fonctionne correctement.

BigDecimal fromValueOf = BigDecimal.valueOf(1.3);
//Ceci est nouveau Big Decimal("1.3")Sera la même valeur que

Qu'est-ce que ça veut dire.

Implémentation de BigDecimal.valueOf

En regardant l'implémentation de `` BigDecimal.valueOf (double) '', c'était comme suit. (Cité d'OpenJdk)

    public static BigDecimal valueOf(double val) {
        //La partie commentaire est omise
        return new BigDecimal(Double.toString(val));
    }

L'implémentation est étonnamment simple et BigDecimal est généré à partir de la chaîne en utilisant la valeur obtenue en convertissant le type double en une chaîne avec `` Double.toString (double) ''. Par conséquent, tant que Double.toString (double) renvoie correctement la valeur du littéral (ou la représentation numérique correspondante) à partir de laquelle la valeur double est basée, il est susceptible de renvoyer le BigDecimal comme prévu.

Double.toString () restaure-t-il la valeur correctement?

C'est correct dans la plupart des cas, mais cela ne semble pas revenir parfaitement pour les nombres avec de très nombreux chiffres après la virgule décimale.

BigDecimal.valueOf(1.0000000003000003)
//1.0000000003000002

Cependant, si vous ne le visez pas, cela ne changera pas fondamentalement. Il semble peu probable que vous utilisiez un si petit nombre de chiffres.

Résumé

De côté

Au fait, c'est le cas lorsque le double déclaré dans le littéral est utilisé tel quel. Si vous utilisez la valeur après avoir calculé avec le type double, cela ne fonctionnera pas.

BigDecimal.valueOf(1.3 + 1.5 + 1.4)
///4.199999999999999

Après avoir fait le calcul Big Decimal.

Recommended Posts

BigDecimal.valueOf (double) histoire
Histoire de JUnit
Mon histoire de Batis