著者の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は正確な操作ではありませんか?
解決する
関連ドキュメントを確認してください。
裏返すだけです:
double型をBigDecimal型に変換します。
- このコンストラクターの結果は、多少予測できません。
new BigDecimal(0.1)
これにより、0.1に正確に等しいBigDecimalが作成されると思われるかもしれませんが、実際には0.100000000000000055511151231257827021181583404541015625に等しくなります。これは、0.1をdoubleとして正確に表すことができないためです。 - Stringコンストラクターは完全に予測可能で
new BigDecimal("0.1")
あり、0.1に正確に等しいBigDecimalを作成します。また、Stringコンストラクターを優先的に使用することをお勧めします。 - 変換ソースとしてdoubleを使用する必要がある場合は、
BigDecimal.valueOf(0.1)
それを使用でき、返される結果は正確です。
要約する
double型をBigDecimal型に変換するときは、new BigDecimal(0.1)
この。取得される結果が不正確になるためです。
BigDecimal.valueOf(0.1)
またはを使用しnew BigDecimal("0.1")
ます。
IDEAコーディングを使用すると、警告プロンプトが表示されます。
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。