0

10 進数が 2 つあり、1 つは通常のプロセスで、もう 1 つはオファー価格です。次に、割引率を計算し、最も近い整数に制限したいと思います。

コードは次のとおりです。

BigDecimal listPrice = new BigDecimal(510000);
BigDecimal offerPrice = new BigDecimal(433500);
int itemDiscount = (int)Math.ceil(((listPrice.longValue() - offerPrice.longValue()) / (float) listPrice.longValue()) * 100);

itemDiscount の値として 15 を設定すると予想していましたが、驚くべきことに 16 です。次に、各計算を出力して、どのステートメントに問題があるかを示すため、以下のように各ステートメントに System.out.println を配置します。

System.out.println(listPrice.longValue() - offerPrice.longValue()); //==> show 76500
System.out.println((listPrice.longValue() - offerPrice.longValue()) / (float) listPrice.longValue()); // ==> 0.15
System.out.println((listPrice.longValue() - offerPrice.longValue()) * 100 / (float) listPrice.longValue()); // ==> 15.000001

問題は上記のステートメントにあります。15.0 を返す代わりに、15.000001 を返します。そして、それを天井にすると、もちろん15ではなく16が返されます。

この場合の説明は?これはそうですか、それともバグですか?

4

2 に答える 2

2

BigDecimal クラスから直接除算メソッドを使用してみてください。float にキャストしている場合は、 BigDecimal の利点を使用していません。

http://www.roseindia.net/java/java-bigdecimal/bigDecimal-divide-int.shtml

于 2013-08-19T02:43:32.273 に答える