首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript 浮点数之迷:0.1 + 0.2 为什么不等于 0.3?

是只有 JavaScript 中存在吗?带着这些疑问本文重点梳理这背后的原理及浮点数在计算机中的存储机制。 通过本文你能学到什么?...了解下科学计数,下文讲解会用到 在日常生活中遇到一个比较大的数字,例如全国总人口数、每秒光速等,在物理上用这些大数表达很不方便,通常可以采用科学计数表达。...十进制小数二进制,小数部分,乘 2 取整数,若乘之后的小数部分不为 0,继续乘以 2 直到小数部分为 0 ,取出的整数正向排序。...其中能够真正决定数字精度的是尾部,即 64Bits 分为以下 3 个部分: sign bit(S,符号):用来表示正负号,0 为 正 1 为 负(1 bit) exponent(E,指数):用来表示次方数...二进制浮点数的科学计数表示 任何一个数都可以用科学计数表示,0.1 的二进制科学计数表示如下所示: 以上结果类似于十进制科学计数表示: 3.

3.7K31

javascript(二):数据类型&数值

javascript一切皆对象,即所有数据都可认为是广义的对象! typeof运算符:确定一个值是什么类型;返回的是字符串类型。...2.2数值精度 根据国际标准IEEE 754,javascript浮点数的64个二进制位,从最左边开始,这样构成: 第1位:符号位,0表示整数,1表示负数; 第2~12位:指数部分; 第13~64位:小数部分...因此javascript提供的有效数字最长为(13~64)+1=53个二进制位。 所以绝对值小于2的53次方的整数,即-(2^53-1) ~ 2^53-1,均能精确表示! ?...注意:对于有些会自动转化为科学计数数字,parseInt会将科学计数数字转化为字符串,所以会导致一些另类的结果: ?...parseFloat():用于一个字符串转化为浮点数。 字符串符合科学计数,会进行相应的转换;碰见字符串中不能转换为浮点数的字符时,停止转换,返回已转换好的部分; ?

1.4K50
您找到你想要的搜索结果了吗?
是的
没有找到

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

指数位可以通过下面的方法转换为使用的指数值: ?...IEEE-745浮点数表示记录数值范围 从存储结构中可以看出, 指数部分的长度是11个二进制,即指数部分能表示的最大值是 2047(2^11-1) 取中间值进行偏移,用来表示指数,也就是说指数的范围是...2^1024 和 2^-1023 转换为科学计数如下所示: 1.7976931348623157 × 10^308 5 × 10^-324 因此,JavaScript中能表示的最大值是 1.7976931348623157...所以,JavaScript提供的有效数字最长为 53 个二进制位,其内部实际的表现形式为: (-1)^符号位 1.xx...xx 2^指数位 这意味着,JavaScript表示并进行精确算术运算的整数范围为...计算机中的数字都是以二进制存储的,二进制浮点数表示并不能精确的表示类似0.1这样 的简单的数字 如果要计算 0.1 + 0.2 的结果,计算机会先把 0.1 和 0.2 分别转化成二进制,然后相加,

2.7K20

浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源

其存储结构如下图所示: 指数位可以通过下面的方法转换为使用的指数值: IEEE-745浮点数表示记录数值范围 从存储结构中可以看出, 指数部分的长度是11个二进制,即指数部分能表示的最大值是 2047...2^1024  和 2^-1023  转换为科学计数如下所示: 1.7976931348623157 × 10^308 5 × 10^-324 因此,JavaScript 中能表示的最大值是 1.7976931348623157...,JavaScript 返回一个不正确的值,这称为 “正向溢出(overflow)” 或 “负向溢出(underflow)” 。 ...所以,JavaScript 提供的有效数字最长为 53 个二进制位,其内部实际的表现形式为: (-1)^符号位 * 1.xx...xx * 2^指数位 这意味着,JavaScript表示并进行精确算术运算的整数范围为...计算机中的数字都是以二进制存储的,二进制浮点数表示并不能精确的表示类似0.1这样 的简单的数字 如果要计算 0.1 + 0.2 的结果,计算机会先把 0.1 和 0.2 分别转化成二进制,然后相加,

2.8K30

js浮点数精度问题详解

在计算机中,浮点数通常使用IEEE 754标准来表示。该标准将浮点数分为符号位、指数位和尾数位,使用科学计数表示一个浮点数。...为什么会出现这样的结果浮点数表示在计算机中,浮点数通常使用IEEE 754标准来表示。该标准将浮点数分为符号位、指数位和尾数位,使用科学计数表示一个浮点数。...该规范定义了浮点数的格式,对于 64 位的浮点数在内存中的表示,最高的 1 位是符号位,接着的 11 位是指数,剩下的 52 位为有效数字,具体表示方式如下:符号位 S:用于表示正负号。...指数位 E:用于表示浮点数的指数部分,以二进制补码形式存储。中间的 11 位存储指数(exponent),用来表示次方数。尾数位 M:用于表示浮点数的有效数字部分,以二进制形式存储。...举例说明示例一console.log(0.1 + 0.2); // 0.30000000000000004为了验证该例子,我们得先知道怎么浮点数转换为二进制,整数我们可以用除 2 取余的方式,小数我们则可以用乘

29150

JavaScript数值

概述 JavaScript 只有一种数值类型,书写数值时带不带小数点均可。超大或超小的数可通过科学计数来写。 JavaScript 数值始终是 64 位的浮点数。...此格式用 64 位存储数值,其中 0 到 51 存储数字(片段),52 到 62 存储指数,63 位存储符号: 值 指数 符号 52 bits(0 - 51) 11 bits (52 - 62) 1 bit...(63) 精度:整数(不使用指数或科学计数)会被精确到 15 位。...toExponential() :返回字符串值,它包含已被四舍五入并使用指数计数数字。参数定义小数点后的字符数。该参数是可选的。如果您没有设置它,JavaScript 不会对数字进行舍入。...MIN_VALUE 返回 JavaScript 中可能的最小数。 NEGATIVE_INFINITY 表示负的无穷大(溢出返回)。 NaN 表示数字值(“Not-a-Number”)。

92920

小小的 float,藏着大大的学问

十进制数二进制采用的是除 2 取余,比如数字 8 二进制的过程如下图: ? 接着,我们看看「整数类型」的数字在计算机的存储方式,这其实很简单,也很直观,就是十进制的数字转换成二进制即可。...---- 十进制小数与二进制的转换 好了,整数十进制二进制我们知道了,接下来看看小数是怎么二进制的,小数部分的转换不同于整数部分,它采用的是乘 2 取整十进制中的小数部分乘以 2 作为二进制的一位...比如,指数如果是 8,则实际存储的指数是 8 + 127 = 135,即把 135 转换为二进制之后再存储,而当我们需要计算实际的十进制数的时候,再把指数减去偏移量即可。...结果和我们前面推到的类似,因为 JavaScript 对于数字都是使用 IEEE 754 标准下的双精度浮点类型来存储的,而我们二进制只能精准表达 2 除尽的数字 1/2, 1/4, 1/8,但是例如...十进制整数二进制使用的是「除 2 取余」,十进制小数使用的是「乘 2 取整」。 计算机是怎么存小数的?

1.7K20

浮点数在内存中的存储

一、用科学计数存储小数 一个小数,如5.5,它在存储进入计算机之前会先转化成科学计数的形式,先将5.5化为二进制形式,即101.1,接着转化成科学计数的形式便是1.011*2²,再进一步转化为国际标准...M表示有效数字, M的范围为1<=M<2 ,根据科学计数和二进制环境(0,1)得出来的结论 2^E表示指数位。...总结: (-1)^S为符号位,M为有效数字,2^E表示指数位 (2)练习: 将以下小数转化为国际标准IEEE的形式 5.5、-9.25、8.75、3.875,-6.125 5.5:第一步...,转换为二进制形式:101.1 第二步,科学计数,1.011*2² 第三步,国际标准IEEE, 不难看出,我们距离国际标准IEEE的 V...这样做是为了表示±0,以及接近于 0的很小的数字

13310

多数编程语言里的0.1+0.2≠0.3?

而且,当一个数字在使用科学计数表示的时候,它会被归一化成小数点前一个非零的十进制数字的形式,例如,0.0005606在用科学计数表示并归一化后,它被表示为: ?...第一步是十进制的0.1换成等价的二进制数。为此,我们先将0.1乘以2,然后小数点前的数字分开,以得到二进制等价值。 ?...对于64位重复此操作,我们按升序排列它们以获取尾数,根据双精度标准,我们将把其四舍五入为52位。 ? 用科学计数表示它并将其四舍五入到前52位产生: ?...尾数部分已准备就绪,现在,对于指数使用以下计算: ? 在这里,11表示将用于指数的64位表示的位数,而-4表示科学计数指数数字0.1最终表示为: ? 相似地,0.2被表示为: ?...在使两者的指数相同之后两者相加会得到: ? 当以浮点表示时,它将变为: ? 这就是0.1+0.2在计算机二进制中的表示

77920

「硬核JS」数字之美

,我们十进制 57 转换为 2 进制 55 % 2 // 商 27 余 1 27 % 2 // 商 13 余 1 13 % 2 // 商 6 余 1 6 % 2 // 商 3 余 0 3 %...当然我们现在只考虑了整数,并没有说小数,是为了方便我们理解原码、反码和补码,接着来道 JavaScript数字存储 JavaScript 不是类型语言,它与许多其他编程语言不同,JavaScript...没有不同类型的数字,比如整数、短、长、浮点等等 在 JavaScript 中,数字不分为整数和浮点型,也就是所有的数字都是使用浮点型类型来存储,它采用 IEEE 754[1] 标准定义的 64 位浮点格式表示数字...阶码真值即为科学记数指数真实值的 2 进制表达,它表明了小数点在尾数中的位置 那么为什么阶码真值与偏移量相加得到阶码呢?...,那么它们是什么呢 规格化的情况其实就是上面我们说的一般情况,因为阶码不能为 0 也不能为 2047,所以指数不能为 -1023,也不会为 1024,只有这种情况尾数才会有隐含位 1 即默认忽略的那一位

5.4K20

(二)《数字电子技术基础》——数制

目录 数制介绍 数制转换 各进制转换为十进制 十进制转换为其他进制 十进制二进制 十进制其他进制 二进制与八进制之间的转换 二进制八进制 八进制二进制 二进制与十六进制之间的转换       ...二进制十六进制 十六进制二进制 八进制与十六进制之间的转换 二进制正负数及其表示 二进制算术运算 二进制正负数的表示 二进制正负数的顶点浮点表示 二进制数补码及其运算 二进制数三种表示​​​​​​​...十进制其他进制         十进制转换为R进制的方法:整数部分采用基数 (R)除法,即除基(R)取余,逆序排列;小数部分采用 基数(R)乘法,即乘基(R)取整,顺序排列,与十进制二进制类似,就不做过多介绍...二进制正负数的表示数字电路和数字电子计算机中,二进制数的正、负号也用“0”和“1”表示。...浮点表示:即小数点的位置可以变化,结合下面这张图来理解一下,第一个Ef()代表的是指数部分的正负符号,第二个E()代表的是指数的大小,第三个S()表示的是数的正负,第四个E()代表的是数值。

1.2K10

JavaScript中科学计数的问题

科学计数允许字母e 或 E 的后面,跟着一个整数,表示这个数值的指数部分。...以下两种情况,JavaScript 会自动数值转为科学计数表示 (1) 小于1且小数点后面带有6个0以上的浮点数值: JavaScript 代码: 0.0000003 // 3e-7 0.00000033...一般情况你可以使用.toString() 科学计数数字转化为直观的数字表示,例如: JavaScript 代码: ""+1.401e10 // "14010000000" 1.401e10.toString...toNonExponential(1.401e10) // "14010000000" toNonExponential(0.0004) // "0.0004" 解析一下: 用.toExponential()数字转化为科学记数表示...e([+-]\d+)/,获取科学记数中小数点后的字符及幂指数(e 后面的值),这样可以确定数字是几位小数。再用toFixed()转换成数值表示

11.7K61

【JS进阶】你真的掌握变量和类型了吗

发生小数计算错误的具体原因是什么? Symbol的特点,以及实际应用场景是什么? [] == ![]、[undefined] == false为什么等于true?代码中何时会发生隐式类型转换?...5.4 IEEE 754 IEEE754标准包含一组实数的二进制表示。它有三部分组成: 符号位 指数位 尾数位 三种精度的浮点数各个部分位数如下: ?...image 符号位就是标识正负的,1表示负,0表示正; 指数位存储科学计数指数; 尾数位存储科学计数后的有效数字; 所以我们通常看到的二进制,其实是计算机实际存储的尾数位。...JavaScript表示的最大数字 由与IEEE 754双精度64位规范的限制: 指数位能表示的最大数字:1023(十进制) 尾数位能表达的最大数字即尾数位都位1的情况 所以JavaScript表示的最大数字即位...5.7 最大安全数字 JavaScript中Number.MAX_SAFE_INTEGER表示最大安全数字,计算结果是9007199254740991,即在这个数范围内不会出现精度丢失(小数除外),这个数实际上是

3.2K30

JavaScript基本包装类型

描述 toString() 数值转化为字符串,并且可以转换进制 toLocaleString() 根据本地数字格式转换为字符串 toFixed() 数字保留小数点后指定位数并转化为字符串...toExponential() 数字指数形式表示,保留小数点后指定位数并转化为字符串 toPrecision() 指数形式或点形式表述数,保留小数点后面指定位数并转化为字符串(位数比本身位数少则转化为指数形式...第二参为负,直接0, //并且方法会把较小的数字提前,(0,3) alert(box.substr(3, -1)); //” 第二参数为负,直接0...描述 toLowerCase(str) 字符串全部转换为小写 toUpperCase(str) 字符串全部转换为大写 toLocaleLowerCase(str) 字符串全部转换为小写...,并且本地化 toLocaleupperCase(str) 字符串全部转换为大写,并且本地化 var box = ‘Mr.Lee is Lee’; alert(box.toLowerCase

1.4K70

原理解析 | JavaScript 计算0.1 + 0.2真的很难,看完才知道!

上图是64位的双精度浮点数,最高位是符号位S(sign),中间的11位是指数E(exponent),剩下的52位为尾数(有效数字)M(mantissa)。...浮点数科学计数 根据IEEE 754标准,任意一个浮点数的二进制都可以用如下公式进行表示: ?...S为符号位:表示浮点数的正负(0代表正数,1代表负数); E为指数位:存储指数,该数都会加上一个常数(偏移量),用来表示次方数; M为尾数位:表示有效位(尾数),超出的部分自动进1舍0; 双精度的浮点数真值...因为科学计数中的指数是可以为负数,所以约定减去一个中间数(偏移量)1023,[0,1022] 表示为负,[1024,2047] 表示为正。...规格化的值是转为非规格化 指数的值为2,规格化的小数点向左移动2位即可。

67820

为什么0.1+0.2不等于0.3?

在这之前,我们先来了解一个小概念:为了实现计算,数字是如何表示的?极小数和极大数通常用科学计数表示,即: ? 同样,如果一个用科学计数法书写的数字小数点前有一个非零的十进制数,则该数字是标准化写法。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为双精度浮点数。...我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ?...尾数 用科学计数表示二进制 0.1 并只保留前 52 位: ? 尾数部分处理好后。现在我们用下面的方式处理指数: ?...这里,11 代表我们要使用的 64 位表示指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 两个数相加,得到: ?

1.7K20

为什么0.1+0.2不等于0.3?原来编程语言是这么算的……

在这之前,我们先来了解一个小概念:为了实现计算,数字是如何表示的?极小数和极大数通常用科学计数表示,即: ? 同样,如果一个用科学计数法书写的数字小数点前有一个非零的十进制数,则该数字是标准化写法。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为双精度浮点数。...我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ?...尾数 用科学计数表示二进制 0.1 并只保留前 52 位: ? 尾数部分处理好后。现在我们用下面的方式处理指数: ?...这里,11 代表我们要使用的 64 位表示指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 两个数相加,得到: ?

1.1K10

你不会知道编程语言会把0.1+0.2算成多少

在这之前,我们先来了解一个小概念:为了实现计算,数字是如何表示的?极小数和极大数通常用科学计数表示,即: ? 同样,如果一个用科学计数法书写的数字小数点前有一个非零的十进制数,则该数字是标准化写法。...与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,数字存储为双精度浮点数。...我们按 IEEE754 标准用 64 位表示 0.1。第一步是十进制的 0.1 转换为二进制的 0.1。首先将 0.1 乘以 2,然后小数点前的数字分离出来,得到其相应的二进制数。 ?...尾数 用科学计数表示二进制 0.1 并只保留前 52 位: ? 尾数部分处理好后。现在我们用下面的方式处理指数: ?...这里,11 代表我们要使用的 64 位表示指数位数,-4 代表科学计数中的指数。 所以最终数字 0.1 的表示形式是: ? 同理,0.2 表示为: ? 两个数相加,得到: ?

1.2K20

平方根倒数快速算法

接下来的8位表示指数,其指在0-255之间,但是这样就无法表示指数了,因此规定正指数第一位是1,负指数第一位是0,这8位换成10进制后减去127就是实际的指数。...这里的10000001换成10进制后是129,因此表示2^2 = 4. 接下来的23位表示尾数。...所以最终十进制数字就是1.0625 * 2^2 = 4.25. 等价无穷小方法 我们令8位指数转换成为十进制后为E,23位尾数转换成十进制后为W....代进原方程,得到y≈0.528766,x≈0.442695 相减,得到μ=(y-x) / 2 = 0.0430355 这个μ的值代入表达式,计算结果转换为十六进制,就是0x5F3759DF i = 0x5F3759DF...设y是x的平方根倒数,则函数表达式为 转换为x关于y的函数,得到 利用牛顿迭代 带入Xn=y,得到 化简 得到最后一行代码. y = y * (threehalfs - (x2 * y

88110

聊聊计算机的数字表示方法(下)

,是利用科学计数来表达的实数。...IEEE标准通过指数表示空间划分成了三大块: 1)最小值指数(所有位全置0)用于定义0和弱规范数(这里比较有意思,由于尾数有个隐藏的1,所以尾数无法表示0,只能用指数为0来特殊表示0); 2)最大指数...,表示0.1,加上隐藏的整数部分1即为1.1;那么这个2进制浮点数位+1.1*2^2=110,转换为10进制即为5。...指数为什么使用移码而不是补码 还记得我们学习科学记数时,两个使用科学记数表示数字进行计算,第一步就是对阶,即比较两个数指数的大小,如果不相等则通过移动指数较小数字的小数点位置使两个数的指数相等,然后再对小数部分进行加减计算...我们把0.4换为2进制来看看: 0.42=0.8 取0 0.82=1.6 取1 0.62=1.2 取1 0.22=0.4 取0 0.42=0.8 取0 0.82

1.2K40
领券