新しいBigDecimal(double val)の使用に注意してください

著者のWeChatパブリックアカウントをフォローすることを歓迎します:Programming Coconut

今日の午後にユニットテストを実行してエラーを報告したところ、新しいBigDecimal(double val)に関するコードの問題が見つかりました。

質問

ビジネスコード:

/**
 * 校验价格是否一致
 *
 * @param frontPrice 前端商品价格
 * @param realPrice  商品系统价格
 * @return boolean  true 相等
 */
public static boolean comparePrice(BigDecimal frontPrice, BigDecimal realPrice) {
    return frontPrice.compareTo(realPrice) == 0;
}
复制代码

テストコード:

/**
 * 前端价格
 */
BigDecimal forntPrice = new BigDecimal(0.2);
复制代码

次に、comparePriceメソッドが常にfalseを返すことをテストします。frontPriceとrealPriceは明らかに等しく、両方とも0.2です。

問題のトラブルシューティングを行った後、frontPriceの値が0.2ではなく、0.200000000000000011102230246251565404236316680908203125であることがわかりまし

くそー、これはどのように起こりますか、BigDecimalは正確な操作ではありませんか?

解決する

関連ドキュメントを確認してください。

Bigdecimal-doc.png

裏返すだけです:

double型をBigDecimal型に変換します。

  1. このコンストラクターの結果は、多少予測できません。new BigDecimal(0.1)これにより、0.1に正確に等しいBigDecimalが作成されると思われるかもしれませんが、実際には0.100000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1をdoubleとして正確に表すことができないためです。
  2. Stringコンストラクターは完全に予測可能でnew BigDecimal("0.1")あり、0.1に正確に等しいBigDecimalを作成します。また、Stringコンストラクターを優先的に使用することをお勧めします。
  3. 変換ソースとしてdoubleを使用する必要がある場合は、BigDecimal.valueOf(0.1)それを使用でき、返される結果は正確です。

要約する

double型をBigDecimal型に変換するときは、new BigDecimal(0.1)この。取得される結果が不正確になるためです。

BigDecimal.valueOf(0.1)またはを使用しnew BigDecimal("0.1")ます。

BigDecimal-example.png

IDEAコーディングを使用すると、警告プロンプトが表示されます。

Bigdecimal-idea.png

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

おすすめ

転載: juejin.im/post/7122734648517459976