JavaでのBigDecimalにroudingに対処する方法

シーザー:

私は、パーセントを取得するには、このコードを持っています:

final BigDecimal price = BigDecimal.valueOf(215).setScale(2, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(2, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(2, BigDecimal.ROUND_HALF_EVEN);

System.out.println(dayPrice); //71.67
System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01

私は、価格は$ 71.67で、この予約は1日3を持っている、$ 215.00一室コストの予約を持っています。

私は再び元の値を取得しようとすると、私は丸めといくつかの問題を抱えている、71.67 * 3 = 215.01

この種の問題に対処するには?

スティーブ:

私の気持ちはここでの問題は、元の価格を捨てるのではなく、2桁まで小数値を切り捨てることにより道貴重な情報を投げるの一つではないということです。あなたが一つでも多くの小数点以下を保持する場合は、この問題を持っていないでしょう。

ここで私は最終的には2つだけ重要な小数点以下の桁数を取得する対象の値に対する操作の数百を行うために十分な精度を可能にするために、高精度の6桁を保持例を示します。あなたが唯一の2ヶ所程度最後に気にしている場合は、小数点以下6桁で丸め問題を抱えていることはありません。

このコードは、それが2桁に丸めた時点で、単一の日の価格を、印刷する場合を除き、6ヶ所を保持します。

final BigDecimal price = BigDecimal.valueOf(215).setScale(6, BigDecimal.ROUND_HALF_EVEN);
final BigDecimal daysOfThisReservation = BigDecimal.valueOf(3).setScale(6, BigDecimal.ROUND_HALF_EVEN);

final BigDecimal dayPrice = price.divide(daysOfThisReservation, BigDecimal.ROUND_HALF_EVEN).setScale(6, BigDecimal.ROUND_HALF_EVEN);

System.out.println(dayPrice.setScale(2, BigDecimal.ROUND_HALF_EVEN));
System.out.println(dayPrice.multiply(daysOfThisReservation).setScale(2, BigDecimal.ROUND_HALF_EVEN)); //215.01

結果:

71.67
215.00

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313768&siteId=1