Java的浮点类型有两种:float和double
浮点类型的存储
float类型,长度为4字节,也就是32bit,但是数值位并不是32位全部
8bit是阶码,而且是用移码表示的,用于表示小数点的位置
最后剩下的23bit,才是真正表示数值的,所以float的有效位数是23位
double类型,长度8字节,64bit,同理
浮点类型是用科学计数法表示的
精度丢失
输出结果是多少?
正确答案的0.2,在二进制小数下,无法精确表示
十进制的0.2,转换为二进制的小数,计算结果是0.001100110011……无限循环小数
不管是double还是float,有效位数都是有限的,超过有效位数的部分会被截断,导致了精度丢失
这样的,不能用二进制精确表示的小数,相当的多,只有一小部分小数能被二进制精确表示(有限不循环小数)
其中,能被float和double精确表示的就更少了(有限不循环+不超过有效位数)
能被二进制精确表示的10进制小数:0.5,0.25,0.0625,0.75,0.3125……
精度损失的解决
0.2二进制不能精确存储,但是很多时候又需要去存储0.2,这个时候我们需要怎么办?
用BigDecimal表示
原理:BigDecimal用字符串存储数字,输出时也使用字符串,就不会存在精度丢失的问题
import