前言
运行代码
public class demo {
public static void main(String[] args){
System.out.println(0.11+2001299.32);
}
}
运行结果不符合
原因分析
计算机的运算是化为二进制计算的,小数也是一样,会先被转化成二进制,然后基于二进制运算。这样会出现一个问题,计算机会没办法完全准确地存储一些特殊的小数。这个时候就要引用网上看到的资料,计算机十进制化二进制的原理。
十进制化二进制
整数部分:除2取余,逆序排列(余数短除法);
小数部分:乘2取整,顺序排列;
问题出现原因
原因出现在小数部分的化二进制上,对0.1d化二进制会发现,出现无限循环:
0.1(十进制) = 0.000110011......(二进制)
但是对0.5d化二进制却不会:
0.5(十进制) = 0.1(二进制)
本质就是计算机对数据没能准确地存储,也有别的情况又能正常的,涉及的原因是其他方面。
解决方案(Java)
使用BigDecimal类。
在构造参数时使用String类型,或者转化为String类型。用法如下:
public class demo {
public static void main(String[] args){
System.out.println(0.1+0.2);
double a = 0.1d;
double b = 0.2d;
BigDecimal aa = new BigDecimal(Double.toString(a));
BigDecimal bb = new BigDecimal(Double.toString(b));
double answer = aa.add(bb).doubleValue();
System.out.println(answer);
}
}