[JAVA] N'utilisez pas de flotteurs et de doubles pour calculer les fractions monétaires

Prenons une note des parties qui ont été traversées dans le développement de Accounting Saas Japan. C'est une histoire où j'avais précédemment externalisé le développement à l'étranger, et il y avait une partie où je calculais facilement en utilisant des flottants et des doubles, et je l'ai corrigée moi-même.

Le flottant et le double sont interdits pour le calcul fractionnaire du montant monétaire

Fondamentalement, les types binaires à virgule flottante tels que float et double ne doivent pas être utilisés dans les calculs monétaires. Pourquoi? C'est exactement dans le calcul des points Parce qu'il ne peut pas être calculé.

Qu'est-ce que ça veut dire

float a = 1.03;
float b = 0.42;

System.out.println(a-b)
0.6100000000000001

Ce sera. Je ne peux pas vous donner le montant exact ...

Utilisez Big Decimal pour calculer les fractions de montant

Utilisez Big Decimal si vous souhaitez calculer le montant avec précision.

import java.math.BigDecimal

BigDecimal a = new BigDecimal("1.03");
BigDecimal b = new BigDecimal("0.42");

BigDecimal c = a.subtract(b);
System.out.println(c.toString());
0.61

BigDecimal ne peut pas être décrit avec un code de calcul, il est donc difficile à voir de toute façon, et cela semble ennuyeux.

Grand piège décimal

Il y a un piège si vous pouvez utiliser Big Decimal ici. Si vous faites une erreur dans l'affectation initiale dans BigDecimal, cela n'aura pas de sens même si vous essayez de calculer avec précision dans BigDecimal. Cela signifie que lorsque vous remplacez une fraction, vous ne devez pas la substituer numériquement. Vous devez le remplacer par une lettre.

BigDecimal rate1 = new BigDecimal("0.1");
BigDecimal rate2 = new BigDecimal(0.1);

C'est la différence Le premier peut être calculé avec précision car il est passé en tant qu'argument de chaîne. Ce dernier est un piège où 0.1 s'écoule vers le constructeur de l'argument double, il est donc traité comme une virgule flottante binaire puis assigné! Je n'ai pas besoin du constructeur à double argument lui-même, et je veux que ce soit une erreur de compilation.

finalement

J'utilisais des flotteurs et des doubles partout pour l'externalisation, et c'était difficile de le réparer.Je faisais un traitement de fraction effrayant pour corriger l'erreur en traitant avec de petites mains. J'étais effrayé. Il est facile de programmer dans le calcul du ratio et le calcul des coordonnées de la configuration de l'écran qui ne nécessite pas une précision parfaite, il est donc facile d'utiliser double ou float, mais pour ceux qui construisent un système qui gère de l'argent, "double pour de l'argent" Il est de notoriété publique que vous devez savoir que «le flottement est interdit» dès le début. Je pleurerai 1 yen plus tard.

Nous avons arrêté cette production offshore et l'avons entièrement réalisée en interne, et nous recherchons actuellement des amis pour créer le système ensemble.

Recommended Posts

N'utilisez pas de flotteurs et de doubles pour calculer les fractions monétaires
Comment utiliser Big Decimal
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser EventBus3 et ThreadMode
[Java] N'utilisez pas "+" dans append!
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment utiliser OrientJS et OrientDB ensemble
Comment configurer et utiliser kapt
[Rails] [Note] Quand ajouter = à <%%> et quand pas
Comment utiliser les méthodes substring et substr
Comment utiliser @Builder et @NoArgsConstructor ensemble
Ne pas émettre de paramètres pour la requête POST et l'URL à partir du formulaire avec Wicket