为什么浮点数 float 或 double 运算的时候会有精度丢失的风险呢?

这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。

浮点数(float 或 double 类型)在计算机中使用二进制浮点表示法存储,这种表示法由三个部分组成:符号位、指数部分和尾数(也称为小数部分或有效数字)。IEEE 754标准定义了单精度(float)和双精度(double)浮点数的编码格式。

精度丢失的原因主要有以下几点:

  1. 有限的尾数位数

    • 单精度浮点数(float)通常有23位的尾数,这意味着它可以精确地表示约6-9位十进制小数。
    • 双精度浮点数(double)有52位的尾数,可以精确表示约15-16位十进制小数。
    • 对于超过这些位数的小数部分,由于位数限制,无法完全精确表示所有的十进制小数。
  2. 非基数10的二进制表示

    • 计算机内部是以二进制形式存储数据的,而许多十进制小数转换成二进制时并不能得到一个有限长度的循环小数或终止小数。例如,十进制的0.1(1/10)在二进制下是无限循环小数,因此不能被精确存储在有限长度的浮点数中。
  3. 运算过程中的舍入误差

    • 在进行加减乘除等运算过程中,因为数值的内部表示不精确,所以运算结果也需要进行舍入处理以适应浮点数的存储格式,这就可能导致累积的误差。
  4. 近似值运算

    • 浮点数的运算有时会产生近似值而不是精确值,尤其是在涉及比较操作或者多次计算后,可能会导致原本相等的两个数在浮点计算后不再严格相等。

总之,由于上述原因,在进行浮点数运算时,特别是涉及到一些不能精确用二进制表示的十进制小数,以及多次运算后的累积误差,就可能出现精度丢失的问题。这在金融、科学计算等领域尤其需要注意,并可能需要通过特定的方法(如使用BigDecimal类进行精确计算)来避免此类问题。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值