2012-01-03 17 views
4

JSONObjectを使用して、サーバーからjson応答を読み取ります。サーバーは10進数を返します。通常の数字は問題ではありませんが、フォームの小数が0.00068の場合に問題が発生します。 0.00068のような数字は自動的にDoubleオブジェクトに格納されます。そのような数値を取得しようとすると、getDouble(index)メソッドでdouble型にアクセスした場合でも、数値がgetString(index)メソッドでdouble型であっても数値の "computerized scientific notation"が返されます。json.jarからJSONObjectを回避する方法は、10進数の文字列をdoubleに変換します。

double型の値を文字列に変換してみましたが、DoubleBigDecimalに変換したときに、正の丸めが加えられているので、この型の値を削除しました。これは、スケーリングをBigDecimal.ROUND_CEILINGに設定している間は、セットを四捨五入することで無くすことができます。しかし、実際の値が小さな小数であり、小数点の後に6桁を超えないことをサーバーが保証しているので、元の値でスケーリングを望んでいません。

BigDecimal big = new BigDecimal(new Double(0.00680)); 

System.out.println(big.toPlainString()); //0.006799999999999999621136392846665330580435693264007568359375 

System.out.println(big.setScale(15, BigDecimal.ROUND_DOWN)); //0.006799999999999 

は、スケーリングせず数0.00680である、または私たちは、それぞれの数値クラスにしてJSONObject解釈数字を防ぐことができますダブルの実際の文字列値を取得するいくつかの方法が存在する場合があります。

ありがとうございます。あなたが使用してJSONライブラリーとは無関係の

+1

JSONObjectという名前のJSON Javaライブラリが2つあります。 org.json。*およびnet.sf.json。*。あなたが話しているのはどれですか? –

+0

私はorg.json。*またはorg.json.JSONObjectを使用しています。 – Ameya

答えて

5

、それは

代わりに、二重のバイナリ浮動小数点値の正確な10進数表現を使用していますので、あなたがするので、静的valueOfメソッドを使用し、二重のパラメータを取るBigDecimal constructorを使用するべきではありませんdoubleの文字列値を使用して正しく丸めます。

BigDecimalのソースとしてdoubleを使用する必要がある場合、このコンストラクタは正確な変換を提供します。 Double.toString(double)メソッドを使用してdoubleをStringに変換した後にBigDecimal(String)コンストラクタを使用した場合と同じ結果が得られません。その結果を得るには、static valueOf(double)メソッドを使用します。

しかし、非常に大きなまたは小さな数字は、二重に解析するために、すでにその場合、唯一の解決策は、のBigDecimalとして数字を解析するサポート異なるJSONライブラリを使用するようになり、丸め誤差を導入している場合があります。

+0

答えはありがたいですが、valueOf(double)はデフォルトの丸めをいくつか行います。System.out.println(BigDecimal.valueOf(new Double( " - 0.00066359999"))。toPlainString()); //-0.000006636完全な解決策ではありません。この質問は、JSONObjectを避けてJSONObjectを解析して、ドキュメント内のStringオブジェクトにデフォルトオブジェクトを適用する方法を探していたので、JSONに関連しています。 。 – Ameya

+0

Java 1.6.0_26でコンピュータに "-0.00066359999"という文字が表示されるため、丸めが表示されません。それでも、数値をBigDecimalとして解析できる別のJSONパーサーに切り替える方が良いでしょう。 –

+0

丸めのメカニズムは、小数点の前の桁数に完全に依存します。 – Ameya

0
String str = BigDecimal.valueOf(Obj.getDouble("StringName")).toPlainString(); 
+2

このコード専用の回答についての説明は貴重です。 – Pyves

関連する問題