由于计算机表示方法的问题,计算机中整数和浮点数的二进制表示是不同的。我们知道,如果要把一个10进制整数转化为相应的2进制数只要把10进制数不断的除2取余就可以了。而浮点数的小数部分是不一定能够用2进制来准确表示的,要将一个小数转化为相应的2进制数需要将小数部分不断的乘2,并截取相应的整数部分。比0.625转为二进制:
0.625*2 = 1.25, 整数部分为1,小数部分为0.25
0.25 * 2 = 0.5 , 整数部分为0,小数部分为0.5
0.5 * 2 = 1 , 整数部分为1,小数部分为0
所以0.625转换成2进制的值是0.101,但是,有的小数,比如0.4是不能精确转换成2进制数的:
0.4*2=0.8 整数部分为0,小数部分为0.8
0.8*2=1.6 整数部分为1,小数部分为0.6
0.6*2=1.2 整数部分为1,小数部分为0.2
0.2*2=0.4 整数部分为0,小数部分为0.4
……
所以0.4转化为2进制数为0.0110……
这样带来的问题是会在浮点数的运算中出现我们不希望出现的结果,特别是在进行结果的比较时。如0.1+0.1+0.1-0.3的结果是一个略大于0的数而不是0。解决这个问题的方法是使用decimal对象。它可以指定浮点数的精确度和round方法等信息(通过context对象),较多运用于金融货币等方面的比较。
相关资源:Java 面经手册·小傅哥(公众号:bugstack虫洞栈).pdf