2015-12-29 4 views
5

私のプロジェクトでは、APIから文字列値を取得しており、別のAPIに二重の値を渡す必要があります。文字列の値を2倍に解析しようとすると、元のデータが得られません。文字列をダブル解析して間違った結果を返す

ここにコードがあります。

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))); 

出力は

11352721345377306.00 
11352721346734308.00 
11352721346734308.00 
11352721346734308.00 

は、何が間違っていたのですか?解析に問題はありますか?元の値を戻すにはどうすればいいですか?

編集:10進フォーマットを使用せず:

1.1352721345377306E16 
1.1352721346734308E16 
1.1352721346734308E16 
1.1352721346734308E16 
+4

使用 'BigDecimal'は値を取得します。 'BigDecimal dec =新しいBigDecimal(l4); \t System.out.println(df.format(dec)); ' – Truthira

+0

@ ThanigaiArasuありがとう。私はAPIのソースが編集可能ではないので、二重の値を渡す必要があります:) –

答えて

8

あなたは元の値を取り戻すことはできません。このJava's Floating-Point (Im)Precisionを参照してください。

+0

私はその値が必要です。何か別の選択肢はありますか? –

+4

@MadhukarHebbar:BigDecimalを使用しますか? – npinti

+0

はいBigDecimalを使用することができます。しかし、apiはdoubleを受け入れています。私は 'BigDecimal.doubleValue'が同じ出力を返そうとするとsource.evenを持たないjarです。 –

0

問題点は何ですか? ".00"?これが必要ない場合は、Doubleを使用する理由は? BigDecimalを持つ

あなたはこのように試みることができる...

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()); 

編集、正しい値を取得する:

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); 

出力は次のとおりです。

11352721345377306 
11352721346734307 
11352721346734308 
11352721346734309 
+0

問題は値が異なることです。 – Manu

+0

ありがとうございます。値の型 'double'を渡す必要があります –

+0

大きい値のlongまたはdoubleを使用して精度を維持することはできません。 – Truthira

4

doubleはわずか15を持っています/ 16桁の精度とそれを表すことができない番号を与えるとき、それは最も近い表現可能な数をとります。

+0

ああ今は起こっています。 :) –

0

あなたは

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

が丸みを帯びた小数のダブル取得するために使用することができます。印刷用の

String formatted = String.format("%.2f", yourDouble); 
関連する問題