单精度浮点数
单精度浮点数最高可精确到1/2^24,也就是1/16777216,什么意思呢?就是说16777216与16777217,如果用单精度浮点数来表示,其结果是一样的。以下Java代码可直观看到精度损失。
/**
* @description: 测试单精度浮点数精度
* @author: banmao
* @date: 2022/1/13 12:32
*/
public class TestFloat {
public static void main(String[] args) {
int i = 123456789;
float f = i;
System.out.println(f); // 输出为1.23456792E8
}
}
为什么会损失精度呢?这个首先需要了解计算机中的浮点数是怎么存储的,可阅读计算机中存储整数、小数与字符串
这里简要说明下,因为计算机存储小数是通过科学计数法来存储的,有效位为23位,精度为24位,而上面代码中的示例的整数为123456789,转换成32位的二进制为111010110111100110100010101
,取前24位10000010(指数) 111010110111100110100010(有效数)
,舍入处理为10000010(指数为3) 111010110111100110100011
,其实也就是111010110111100110100011000
,得出的十进制为123456792
,这就是导致精度损失的原因。
双精度浮点数
双精度浮点数的有效数位为52位,精度为53位,于是双精度浮点数可精确到1/2^53,也就是1/9007199254740991。
总结
1、单精度浮点数最高精确到1/16777216,双精度浮点数最高精确到1/9007199254740991
2、整数转浮点数可能会丢失精度,在Java中,int->float,long->float,long->double,这三种转换可能会造成精度损失。
扩展
1.BigDecimal对于精度损失有作用吗?