我明白了,js中的number

简介: js中的number类型采用的是64位浮点数,也就是js中的整数、小数统统都是浮点数噢。

感谢然叔老师的精彩讲解。Day01 JS整数是怎么表示的 | 面试打卡365,但是有些地方还是不怎么理解,还自以为是的走进了误区,随着不断的深入讨论研究,终于搞清楚了,所以我要总结一番。

js中的number类型采用的是64位浮点数,也就是js中的整数、小数统统都是浮点数噢。国际标准 IEEE 754中js的64个浮点数二进制位如下图,图是从然叔老师那里拷过来的。

image.png

这三个部分虽然然叔老师的文章中有,但是以我的理解再说明一下,

  1. sign:正负,表示一个数字是正数还是负数,在二进制中 0 为正 1 为负
  2. exponent:表示整数部分的指数,为11位二进制码,但是由于国际标准 IEEE 754中对这个指数偏移了1位,也就是说2^(11-1)等于1024,也就是说js中的整数最大值为2^1024,你将Number.MAX_VALUE进行指数运算,结果就是1024
    image.png
  3. fraction:表示浮点数中有效的小数部分,为52位二进制码噢,由于有效的小数的二进制码位数是52位,所以有效的整数的二进制码位数也是52位。由于国际标准 IEEE 754中对指数部分偏移了1位,那么自然小数部分就多加了1位,所以有效的小数的二进制码位数是53位了,有效的整数的二进制码位数也同理如此。你将Number.MAX_SAFE_INTEGER进行指数运算,结果就是53
    image.png

然后还有为啥0.1 + 0.2 不等于 0.3,这个然叔老师的文章也有说明,其实就是国际标准 IEEE 754中无法用二进制码表示不了0.1和0.2,而0.1+0.2的时候会进行二进制的运算,从而导致精度溢出,二进制码位数不足,只能进行裁剪,在裁剪的时候会对最后一位进行向上取整。
如下:

(0.1).toString(2) //                 0.0001100110011001100110011001100110011001100110011001101
(0.2).toString(2)//                  0.0011001100110011001100110011001100110011001100110011010
/*计算器中0.1+0.2二进制码计算结果*///  0.0100110011001100110011001100110011001100110011001100111
(0.3).toString(2)//                  0.0100110011001100110011001100110011001100110011001100110
(0.30000000000000004).toString(2)//  0.0100110011001100110011001100110011001100110011001101000

可以看出js中0.1+0.2的二进制计算结果进行了向上取整,然后将向上取整后的值转成十进制后就是0.30000000000000004

总结:这篇文章写的随意,也没啥标题,以后如果有机会研究的更加深入,再做补充。感谢然叔老师的文章和视频,让我迷途知返,感谢大圣老师以及群里同学的出谋划策,将我从理解误区中纠正过来。

目录
相关文章
|
3月前
|
JavaScript 前端开发
javaScript Number 对象
avaScript Number 对象是 JavaScript 中用于表示数字的基本类型之一。它表示的数字可以是整数,也可以是浮点数。在 JavaScript 中,所有的数字都是 Number 类型的实例,可以通过 new Number() 构造函数来创建。此外,JavaScript 还提供了一些用于处理数字的常用方法和属性,例如 parseFloat()、parseInt()、isNaN()、is
97 6
|
4月前
|
JavaScript 前端开发
js数字(Number)方法汇总
js数字(Number)方法汇总
23 0
|
2月前
|
存储 JavaScript 前端开发
编程笔记 html5&css&js 066 JavaScript Number数据类型
编程笔记 html5&css&js 066 JavaScript Number数据类型
|
9月前
|
JavaScript 前端开发
js/javascript——常见Number的常用方法
js/javascript——常见Number的常用方法
54 0
|
5月前
|
JavaScript 前端开发
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
30 0
|
5月前
|
JavaScript 前端开发
js基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。具体案例使用演示
js基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。具体案例使用演示
35 1
|
6月前
|
存储 JavaScript 前端开发
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
39 0
|
6月前
|
存储 JavaScript 前端开发
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
【JS交互埋坑】事件函数自动将数字字符串String转为数值Number
89 0
|
6月前
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
65 1
|
3天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
5 0