文章预览
本文主要是日常业务开发中自身碰到过跟常识不一致的坑,问题虽然基础,但却可能造成比较大的线上问题。 转BigDecimal类型时精度丢失 public class Test { public static void main ( String[] args ) { BigDecimal bigDecimal = new BigDecimal( 0.1 d); System. out .println(bigDecimal); } } 以上代码本认为输出的是BigDecimal类型的0.1,但输出的却是: 0 .1000000000000000055511151231257827021181583404541015625 出现这种情况的原因是,当我们用new BigDecimal(0.1)创建对象是,会调用BigDecimal以下构造方法: public BigDecimal(double val ) { this ( val ,MathContext.UNLIMITED); } double计算的时候会把数值转换成二进制,而0.1转换成二进制是无法除尽的,所以就带了一大串小数,所以最安全的做法还是: BigDecimal bigDecimal = BigDecimal.valueOf( 0 . 1d ); 在这个方法中,会把double先转为string进行计算: public
………………………………