Java中单精度与双精度浮点数精度问题


单精度浮点数

单精度浮点数最高可精确到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对于精度损失有作用吗?


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM