为什么有精度问题

  1. 首先,计算机中如何存储小数是一个叫做IEEE标准决定的
  2. Java中float占32位,其中第三十一位为符号位 s, 第三十位到第二十三位为指数位,,剩余第二十二位到 第一位为有效数字位,也就是说,一个小数用IEEE浮点标准表示为

    1. 理解:因为M表示的是11001这样子的零一序列
    2. M * 2^E 其实就是把M这些数字序列往做或者往右挪动E位
  1. 有一句话是: 浮点数只是对小数的粗糙近似,而不是其完全刻画
    1. 在任何两个不相等的实数中,存在着无数个两两不等的实数,但是这一点在浮点数中无法体现

    1. 在这两个浮点数中间 01111110100000000000000000000001 和 01111110100000000000000000000000的差值高达1.014 * 10的31次方他们中间应该存在着无数个实数
    2. 但是在浮点数中,他们是相邻的,两者间不存在任何数
    3. 这就是计算机中存在的浮点数问题
  1. 继续看一个十进制小数转换为二进制小数的例子,二进制和十进制小数的表示存在相同点也存在不同点,二进制小数点后表示的是2的负幂,十进制小数表示的是10的负幂 比如78.375
    1. 整数部分

    1. 小数部分

    1. 所以 78.375的二进制形式就是1001110.011
    2. 然后,根据符号位,尾数,阶码的表示方式,就有了

  1. 那么就有一个问题:因为第三点提到的精度问题,在第四点中的小数转换部分,会不会有可能出问题?换句话说,因为浮点数无法完全刻画所有小数,那就是说有的小数无法在浮点数中找到对应的表示方式?
    1. 答案是肯定的
    2. 这就可以解释java中使用小数进行加减乘除有时候出现的“奇怪的问题了”
      1. 可能是等号左边的参数本身无法用浮点数进行完全刻画
      2. 可能是计算结果无法用浮点数完全刻画
      3. 或者都是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值