美文网首页
浮点数的二进制表示

浮点数的二进制表示

作者: 一只程序员 | 来源:发表于2018-03-09 14:53 被阅读0次

在很多编程语言中,发现会出现0.1*3==0.3最后结果为false的情况,查了下资料记录为下:

1.浮点数的二进制表示

在编程语言中,类如java,js ,c ,数据都是以二进制的形式存在磁盘中的,数字也不列外,当计算机拿到一个数字存储时 ,会将数字转换成二进制存在磁盘中,所以我们首先弄清楚数字怎样转换为二进制:

  • 整数部分乘2取余后逆向排序
  • 小数部分乘以2取整数部分,知道小数部分为0为止,然后顺序排序

所以,0.1在计算机转换为二进制时不断进行乘2操作

  • 0.1×2 = 0.2 取0;
  • 0.2×2 = 0.4 取0;
  • 0.8×2 = 0.8 取0;
  • 0.6×2 = 1.6 取1;
  • 0.2×2 = 1.2 取1;
  • 0.1×2 = 0.2 取0;
    .....
    所以0.2在计算机中存储二进制位=>0.0001100110011...(循环0011)

而0.2在计算机转换为二进制时不断进行乘2操作

  • 0.2×2 = 0.4 取0;
  • 0.8×2 = 0.8 取0;
  • 0.6×2 = 1.6 取1;
  • 0.2×2 = 1.2 取1;
  • 0.1×2 = 0.2 取0;
    .....
    所以0.2在计算机中存储二进制位=>0.001100110011...(循环0011)

2.IEEE 754 规范

java语言采用的IEEE754的规范来存储浮点数,即float和double两种类型
float类型即具有24位有效数位,加上符号位1位+尾数23位 = 24位
因为float具有24位有效数位 ,除去1位符号位 即有23位存储位对应7~8位有效十进制数字
double类型即具有53位有效数位,加上符号位1位+尾数52位 = 53位
因为double具有24位有效数位 ,除去1位符号位 即有52位存储位对应15~16位有效十进制数字
0.1在计算机中有效存储为52位,即=> 0.00011001100110011001100110011001100110011001100110011001
0.2在计算机中有效存储为52位,即
=> 0.00110011001100110011001100110011001100110011001100110011
那么两者相加0.1的二进制+0.2的二进制
0.00011001100110011001100110011001100110011001100110011001

0.00110011001100110011001100110011001100110011001100110011
=
0.01001100110011001100110011001100110011001100110011001100
转换为10进制为0.30000000000000004!=0.3
所以在java ,js python c等编程语言中0.1+0.2!=0.3都是精度丢失的问题

相关文章

  • 深入浅出iOS浮点数精度问题 (上)

    目录 一,浮点数精度丢失? 二,整数的二进制表示 三,浮点数的二进制表示 四,iEEE 754浮点数的手动转换 五...

  • Python避坑:浮点数运算出现不确定尾数

    什么是不确定尾数 我们都知道在计算机中数据由二进制表示,而浮点数则是小数的一种二进制表示方法。 由于浮点数存在精度...

  • [js]数值的精度

    基础知识 js内部所有数字在计算机内存中的表示都是64位双精度浮点数 双精度浮点数表示法的副作用 使用二进制浮点数...

  • 十进制和二进制互相转换

    二进制表示一般用原码表示,计算加减时用补码表示。这里的二进制小数是用的定点数表示,不是用浮点数表示的。 0X01 ...

  • Double类型运算的精度问题

    浮点数值不适用于无法接受舍入误差的计算中。 舍入误差的主要原因在于浮点数值采用二进制系统表示,而二进制系统中无法精...

  • 5分钟讲清楚浮点数的底层表示

    浮点数的二进制表示,基本上就是用二进制的科学计数法来表示。 一个十进制的数0.75,用科学计数法表示是+7.5*1...

  • 浮点数运算原理

    据以上分析,IEEE 754标准中定义浮点数的表示范围为: 单精度浮点数二进制:± (2-2^-23) × 212...

  • iOS浮点数精度丢失问题及处理方案

    为什么浮点数精度会丢失 浮点十进制值通常没有完全相同的二进制表示形式。 这是 CPU 所采用的浮点数据表示形式的副...

  • IEEE-754浮点数表示法

    几乎所有现代编程语言都采用这种二进制浮点表示法。如 JavaScript 但事实上,二进制浮点数表示法并不能精确地...

  • 32位浮点数16777216.0f 加 1 还是 1677721

    32位浮点数16777216.0f 加 1 为什么不是 16777217.0f ? 16777216二进制表示:<...

网友评论

      本文标题:浮点数的二进制表示

      本文链接:https://www.haomeiwen.com/subject/gjkufftx.html