2010-02-19 9 views
0

J'ai un fichier csv où les champs montant et quantité sont présents dans chaque enregistrement de détail sauf l'enregistrement d'en-tête et de remorque. L'enregistrement de la remorque a une valeur de charge totale qui est la somme totale de la quantité multipliée par le montant de la quantité dans les enregistrements de détail. Je dois vérifier si la valeur de la charge totale de la remorque est égale à la valeur calculée des champs de quantité et de quantité. J'utilise le double type de données pour tous ces calculs. Lorsque je naviguais, je suis capable de comprendre à partir du lien web ci-dessous qu'il pourrait créer un problème en utilisant double type de données, tout en comparant avec des points décimaux. Il est ce qui suggère d'utiliser BigDecimalEn ce qui concerne BigDecimal

http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html

Aurais-je 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 les points décimaux dans le fichier csv. La quantité peut également 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, csd, 123,12.345

-------------- ---------------- Alors que la validation, j'ai 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; 

----------------------- Tout en lisant le fichier 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 

Répondre

1

Spécialement pour tout ce qui concerne les données financières, mais en général pour tout ce qui concerne les nombres lisibles par l'homme, BigDecimal est ce que vous voulez utiliser au lieu de double, comme l'indique cette source.

Le documentation 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 dont vous pourriez avoir besoin.

+0

Merci beaucoup pour l'info – Arav

0

Il est très possible que vous ayez des problèmes avec les doubles, ce qui signifie que la valeur précalculée et la valeur nouvellement calculée peuvent différer de 0,00001 ou moins.

Si vous ne savez pas comment la valeur que vous comparez a été calculée, je pense que la meilleure solution est de définir "égal" comme ayant une différence inférieure à epsilon, où epsilon est un très petit nombre tel que. 0001.

I.e. plutôt que d'utiliser le test A == B, utilisez abs(A - B) < .0001.

+0

Merci beaucoup pour l'info – Arav