2017-07-27 6 views
0

Androidスタジオでは、Javaラウンドのために請求書の合計を計算する際に問題がありました。私は多くの説明があることを知っていますが、多くの人が信頼できる結果を返さない方法を推奨しています。 1.数式(約)4.715 *(倍数)100 /(倍数)100 = 4.72(期待値4.72)
2.数式(約)4.725 * )/(倍数)100 = 4.72(ただし、4.73が予想されます)Androidスタジオでのラウンドインによる観測 - javaそして実用的な説明が期待されています

このコードは、請求書を計算するクライアントのアプリには入れることができません。たとえば、私の場合、同じ請求書が別のシステムで計算され、その結果が異なっているので、それぞれ4.72を意味します。4.73
私はダブルを正確に表すことはできず、小数は私たちが見るものとは異なります。しかし、私たちは期待どおりの結果を返す方法が必要です。

別の例は、次のようになります
1 java.math.BigDecimal.valueOf(4.715).setScale(2、java.math.BigDecimal.ROUND_HALF_UP).doubleValue()= 4.72
2.新しい持つjava.math .setScale(2、java.math).setScale(2、java.math.BigDecimal.ROUND_HALF_UP).doubleValue()= 4.71
3.新しいjava.math.BigDecimal(String.valueOf(4.715)).setScale(2、java.math .BigDecimal.ROUND_HALF_UP).doubleValue()= 4.72

これらの点は、すべてJavaのドキュメントでよく説明できますが、私たちが期待した結果を返す確実な方法であるラウンドを計算するための特定の方法を示す必要があります。私は2小数点に丸めたいだけでした。私は初心者のいくつかを助けることを願っています結論では、

、私は次のような方法が安定して良い結果を返すだろうと思う:
java.math.BigDecimal.valueOf(4.715).setScale(2、持つjava.math .BigDecimal.ROUND_HALF_UP).doubleValue()= 4.72

少なくとも、これは3年以上にわたるアプリの集中的な使用(500+ユーザーの毎日)後の私の観察です。
上記のすべての実際の説明は非常に歓迎されていますので、予期しない結果を避ける方法を理解することができます。

+0

最初の1と2は間違っています。 – matt

+0

BigDecimalを使用する場合は、double型またはfloat型ではなく、文字列で初期化します。したがって、 'x = new java.math.BigDecimal(" 4.715 ")。setScale(2、BigDecimal.ROUND_HALF_UP);' doubleは全く使わないので、BigDecimalで '.doubleValue()'を実行しないでください。 –

+0

マット、1と2は間違っているかもしれませんが、それはデバッガのものとまったく同じです。これは私がこの分野で直面していた問題でした。 ドキュメントは実際の例には適用されず、数学的な観点からのみ説明されるため、私は初心者のためにこれらの側面を明らかにしたかっただけです。 – mihai71

答えて

0

BigDecimalの例では、javadocがその違いを説明しています。

BigDecimal(double value) ...は、doubleの2進浮動小数点値の正確な10進表現です。

値を印刷するだけで確認できます。

かろうじて4.715未満が、それは切り捨てますように十分である
System.out.println(new BigDecimal(4.715)); 
#4.714999999999999857891452847979962825775146484375 

BigDecimal.valueOf(double value)は、かなりの規則を持つDouble.toString(double value)のdouble値の文字列表現を使用します。

System.out.println(Double.toString(4.715)); 
#4.715 

最も安全な方法は、計算にはBigDecimalを使用することです。

関連する問題