En ce qui concerne BigDecimal
-
21-09-2019 - |
Question
J'ai un fichier csv où les champs de quantité et de quantité sont présents dans chaque enregistrement de détail, sauf en-tête et le dossier de la remorque. fiche de remorque a une valeur de charge totale qui est la somme totale de la quantité multipliée par le champ de montant dans les enregistrements de détail. Je dois vérifier si la remorque valeur de charge totale est égale à ma valeur calculée des champs de quantité et de quantité. J'utilise le type de données double pour tous ces calculs. Quand je suis parcouru je capable de comprendre à partir du lien Web ci-dessous que cela pourrait créer un problème en utilisant le double type de données en comparaison avec des points. Il est ce qui suggère d'utiliser BigDecimal
http://epramono.blogspot.com/2005/01 /double-vs-bigdecimal.html
Vais-je obtenir des problèmes si j'utilise deux types de données. Comment puis-je faire les calculs en utilisant BigDecimal. Aussi je ne suis pas sûr combien de chiffres, je vais obtenir après chiffres après la virgule dans un fichier csv. montant également peut avoir une valeur positive ou négative.
Dans le fichier csv
H, ABC ..... "D", ...., "1", "12,23" "D", ....., "3", "- 13,334" "D", ......, "2", "12" T, cdd, 123,12.345
Alors que la validation ------------------------------ je vais avoir le code ci-dessous --------- -----------
double detChargeCount =0;
//From csv file i am reading trailer records charge value
String totChargeValue = items[3].replaceAll("\"","").trim();
if (null != totChargeValue && !totChargeValue.equals("")) {
detChargeCount = new Double(totChargeValue).doubleValue();
if(detChargeCount==calChargeCount)
validflag=true;
----------------------- Lors de la lecture de fichiers CSV j'ai le code ci-dessous
if (null != chargeQuan && !chargeQuan.equals("")) {
tmpChargeQuan=Long(chargeQuan).longValue();
}
if (null != chargeAmount && !chargeAmount.equals("")) {
tmpChargeAmt=new Double(chargeAmount).doubleValue();
calChargeCount=calChargeCount+(tmpChargeQuan*tmpChargeAmt);
}
I had declared the variables tmpChargeQuan, tmpChargeAmt, calChargeCount as double
La solution
Surtout pour quoi que ce soit avec des données financières, mais en général pour tout ce qui concerne le nombre lisible par l'homme, BigDecimal est ce que vous voulez utiliser au lieu de deux, comme cette source dit.
sur BigDecimal
est assez simple, et devrait fournir tout ce dont vous avez besoin.
Il a un int, double, et les constructeurs de cordes, de sorte que vous pouvez simplement avoir:
BigDecimal detChargeCount = new BigDecimal(0);
...
detChargeCount = new BigDecimal(totChargeValue);
Les opérateurs sont mis en œuvre en tant que fonctions, de sorte que vous auriez à faire des choses comme
tmpChargeQuan.multiply(tmpChargeAmt)
au lieu de simplement tmpChargeQun * tmpChargeAmt
, mais cela ne devrait pas être un gros problème.
mais ils sont tous définis avec toutes les surcharges vous pourriez avoir besoin aussi bien.
Autres conseils
Il est très possible que vous aurez des problèmes avec doubles, j'entends par là la valeur précalculée et la nouvelle valeur calculé peut par 0,000001 ou moins.
Si vous ne savez pas comment la valeur que vous comparez à été calculé, je pense que la meilleure solution est de définir « égale » comme ayant une différence de moins de epsilon, où epsilon est un très petit nombre, comme .0001 .
i.e.. plutôt que d'utiliser l'A == B
de test, utilisez abs(A - B) < .0001
.