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
Était-ce utile?

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.

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