1

今天在跑测试用例的时候发现一个奇怪的问题。

dubbo num = 0.88;
BigDecimal b = new BigDecimal(num);

通过debug发现b的值是:0.88000000000000000444089209850062616169452667236328125

分析

由于二进制无法精确地表示十进制小数0.88,当编译器读到0.88的时候又转换为了8个字节的double类型,编译器只能找到一个比较接近的数字表示,于是0.88000000000000000444089209850062616169452667236328125就出现了。也就是为啥阿里巴巴手册上说强制使用了:优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法
image.png

其实valueOf调用的还是toString方法。
image.png

解决

//(1)
dubbo num = 0.88;
BigDecimal b = new BigDecimal.valueOf(num);

//(2)
BigDecimal b = new BigDecimal("0.88");

发飙的蜗牛
19 声望3 粉丝