64位 iee754_IEEE 754标准

本文介绍了IEEE 754标准在浮点数表示中的应用,如Java、JavaScript中的float和double。由于二进制表示的限制,浮点数运算可能导致精度丢失,如0.1 + 0.2不等于0.3。JavaScript中的Number.MAX_SAFE_INTEGER和MIN_SAFE_INTEGER定义了安全整数范围。解决方案包括使用高精度库如Java的BigDecimal。
摘要由CSDN通过智能技术生成

由于不同机器所选用的基数、尾数位长度和阶码位长度不同,因此对浮点数的表示有较大差别,这不利于软件在不同计算机之间的移植。为此,美国IEEE(电器及电子工程师协会)提出了一个从系统角度支持浮点数的表示方法,称为IEEE754标准(IEEE,1985),当今流行的计算机几乎都采用了这一标准。

Java中浮点数,既float和double,都是采用的IEEE754标准。无论在java python javaScript里面都存在 1 + 2 != 3 问题,这个问题的产生根源在于计算存储数字是二进制,对无限循环小数和无理数采用双精度64位double浮点数_float为32位,即52位小数+11位指数+1位符号。超过52位小数溢出而产生精度丢失。

例如在 chrome js console 中:

// 加法

0.1 + 0.2 = 0.30000000000000004

0.1 + 0.7 = 0.7999999999999999

0.2 + 0.4 = 0.6000000000000001

// 减法

0.3 - 0.2 = 0.09999999999999998

1.5 - 1.2 = 0.30000000000000004

// 乘法

0.8 * 3 = 2.4000000000000004

19.9 * 100 = 1989.9999999999998

// 除法

0.3 / 0.1 = 2.9999999999999996

0.69 / 10 = 0.06899999999999999

// 比较

0.1 + 0.2 === 0.3 // false

(0.3 - 0.2) === (0.2 - 0.1) // false

这个问题并不只是在Javascript中才会出现,任何使用二进制浮点数的编程语言都会有这个问题,只不过在 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。

7c636d8f18d5

7c636d8f18d5

浮点数丢失产生原因

JavaScript 中的数字类型只有 Number 一种,Number 类型采用 IEEE754 标准中的 “双精度浮点数” 来表示一个数字,不区分整数和浮点数。

什么是IEEE-745浮点数表示法

IEEE-745浮点数表示法是一种可以精确地表示分数的二进制示法,比如1/2,1/8,1/1024

十进制小数如何表示为转为二进制

十进制整数转二进制

十进制整数换成二进制一般都会:1=>1 2=>10 3=>101 4=>100 5=>101 6=>110

6/2=3…0

3/2=1…1

1/2=0…1

倒过来就是110

十进制小数转二进制

0.25的二进制

0.25*2=0.5 取整是0

0.5*2=1.0    取整是1

即0.25的二进制为 0.01 ( 第一次所得到为最高位,最后一次得到为最低位)

0.8125的二进制

0.8125*2=1.625   取整是1

0.625*2=1.25     取整是1

0.25*2=0.5       取整是0

0.5*2=1.0        取整是1

即0.8125的二进制是0.1101(第一次所得到为最高位,最后一次得到为最低位)

0.1的二进制

0.1*2=0.2======取出整数部分0

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值