今天看到有人提问为什么 Java 里面的 3.1415926f 会显示为 3.1415925 ?
我也很好奇,记忆中应该是七位有效数字才对呀,为什么会多一位呢?
于是自己写了个代码看看是否如此,代码如下
public class Main {
public static void main(String[] args) {
System.out.println(3.1415926f);
}
}
输出结果如下
3.1415925
然后,我百度了一下 “二进制十进制间小数怎么转换”,以及 Java float 的 精度范围大小。得出如下结论:
- float 类型是 32 位,采用单精度浮点表示法:
- 符号位占用1位,用来表示正负数,
- 指数位占用8位,用来表示指数,
- 小数位占用23位,用来表示小数,不足位数补0
- 经过计算发现:
- 十进制七位的 “3.141592” ,以及 八位的 “3.1415921 , 3.1415922 ,3.1415923 ,3.1415924 ,3.1415925” 都是约等于 二进制 0b(11.0010010000111111011)
- 3.1415926f 首先被去掉最后一位,变为 7 位有效数字,即 3.141592f。然后,在计算机中把对应的二进制转换为十进制的时候,变为 3.1415925
简单概括就是,3.1415926f 转换为七位有效数字后,本应该是 3.141592f,但是从二进制转换为十进制的时候就变成了 3.1415925f。后面多了一位有效数字 5 是因为在二进制里面 3.1415925f 和 3.141592f 都是约等于 0b(11.0010010000111111011)。
所以,float 只能保证十进制的 7 位有效数字的精度,虽然有时候会显示多出变成 8 位,但是多出的一位的精度无法保证是正确的。
想了解更多,欢迎关注我的微信公众号:Renda_Zhang