2015-12-29 13 views
5

W moim projekcie otrzymuję ciąg znaków z api i trzeba przekazać podwójne wartości do innego api. Kiedy próbuję parsować z wartości ciągu do podwójnego, nie otrzymuję oryginalnych danych.Parsowanie podwójne na łańcuchu dając nieprawidłowy wynik

Oto kod.

String l1="11352721345377306"; 
String l2="11352721346734307"; 
String l3="11352721346734308"; 
String l4="11352721346734309"; 

DecimalFormat df = new DecimalFormat(".00"); 

System.out.println(df.format(Double.parseDouble(l1))); 
System.out.println(df.format(Double.parseDouble(l2))); 
System.out.println(df.format(Double.parseDouble(l3))); 
System.out.println(df.format(Double.parseDouble(l4))); 

Wyjście jest

11352721345377306.00 
11352721346734308.00 
11352721346734308.00 
11352721346734308.00 

Co poszło nie tak? Czy jest jakiś problem z parsowaniem? Jak mogę odzyskać oryginalne wartości?

Edit: Bez użycia dziesiętny Format:

1.1352721345377306E16 
1.1352721346734308E16 
1.1352721346734308E16 
1.1352721346734308E16 
+4

Wykorzystanie 'BigDecimal' aby uzyskać wartość. 'BigDecimal dec = new BigDecimal (l4); \t System.out.println (df.format (dec)); ' – Truthira

+0

@ThanigaiArasu Dzięki. Muszę przekazać wartość "podwójną", ponieważ źródła api nie można edytować. :) –

Odpowiedz

8

Nie można dostać oryginalne wartości powrotem. Odwołaj się do tego Java's Floating-Point (Im)Precision.

+0

Powinienem potrzebować tej wartości. czy jest jakaś alternatywa? –

+4

@MadhukarHebbar: Użyj BigDecimal? – npinti

+0

Tak, można użyć BigDecimal.Ale api akceptuje tylko podwójne i jest to słoik, którego nie mamy source.ven jeśli spróbuję 'BigDecimal.doubleValue' zwróci to samo wyjście. –

0

Na czym polega problem? ".00"? Jeśli nie potrzebujesz tego, dlaczego używasz Double?

Można spróbować tak ...

String l1="11352721345377306"; 
    String l2="11352721346734307"; 
    String l3="11352721346734308"; 
    String l4="11352721346734309"; 

    Double d1 = Double.parseDouble(l1); 
    Double d2 = Double.parseDouble(l2); 
    Double d3 = Double.parseDouble(l3); 
    Double d4 = Double.parseDouble(l4); 

    System.out.println(d1.longValue()); 
    System.out.println(d2.longValue()); 
    System.out.println(d3.longValue()); 
    System.out.println(d4.longValue()); 

Edit, z BigDecimal aby uzyskać prawidłowe wartości:

String l1="11352721345377306"; 
    String l2="11352721346734307"; 
    String l3="11352721346734308"; 
    String l4="11352721346734309"; 

    BigDecimal bd1 = new BigDecimal(l1); 
    BigDecimal bd2 = new BigDecimal(l2); 
    BigDecimal bd3 = new BigDecimal(l3); 
    BigDecimal bd4 = new BigDecimal(l4); 

    System.out.println(bd1); 
    System.out.println(bd2); 
    System.out.println(bd3); 
    System.out.println(bd4); 

wyjścia:

11352721345377306 
11352721346734307 
11352721346734308 
11352721346734309 
+0

Problem polega na tym, że wartości są różne. – Manu

+0

Dzięki. Muszę podać wartość typu "double" –

+0

Nie można utrzymać precyzji z długimi lub podwójnymi wartościami o większej wartości. – Truthira

4

double ma tylko 15/16 cyfr dokładności, a kiedy podajesz numer, którego nie może reprezentować, zajmuje najbliższy reprezentatywny numer.

+0

Ya.To dzieje się właśnie teraz. :) –

0

Można użyć

double d = Math.round(Double.parse(yourString) * 100.0)/100.0; 

dostać podwójne z zaokrąglonymi po przecinku.

Do użytku drukowania:

String formatted = String.format("%.2f", yourDouble);