大家好,又见面了,我是你们的朋友全栈君。
请看图:
//double 转 BigDecimal 精度测试
@Test
public void a (){
Double Dou = 5.56;
BigDecimal bigDou1 = new BigDecimal(Dou);
BigDecimal bigDou2 = BigDecimal.valueOf(Dou);
log.info("Double转BigDecimal,使用构造方法转化="+bigDou1);//5.55999999999999960920149533194489777088165283203125
log.info("Double转BigDecimal,使用字符串形式转化="+bigDou2);//5.56
}
很明显,经过 double 转 BigDecimal 后,我们最初的值已经发生变化,所以通常我们在做类型转换的时候推荐使用 BigDecimal.valueOf(…);
分析:JDK1.8 源码
BigDecimal bigDou1 = new BigDecimal(Dou);
这个转换结果是double的二进制浮点值的精确十进制表示,其值得结果不是我们可以预测的,如上测试类,经过类型转换:5.56变成了5.55999999999999960920149533194489777088165283203125。是因为转化过程默认使用了精度和舍入模式:
public BigDecimal(double val, MathContext mc) {}; 舍入模式为:public final static int ROUND_HALF_UP =4;也是一种四舍五入,官方解释:該四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距的,在这种情况下是圆括弧的。
BigDecimal bigDou2 = BigDecimal.valueOf(Dou);
源码:
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
使用double通过所提供的规范的字符串表示Double.toString(double)方法。调用BigDecimal bigDou2 = BigDecimal.valueOf(“String”);此时5.56=5.56.所以进行类型转换推荐此方法。
另外:如果数据库存储,可以直接写入 double。
INSERT INTO statistic_info (`id`,`amount`) VALUES (#{bean.id},#{bean.amountDouble});
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136111.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...