首先,先来回答几个问题,大多数开发者,对于这几个问题回答都模糊不清

目录

1.在JS中,小数运算是精确的吗?

2.在JS中,整数运算是精确的吗?

3.在JS中,整数的表示是连续的吗?

4.在JS中,能表示的最大数字是多少?

5.在JS中,能表示的数字最大位数是多少?


1.在JS中,小数运算是精确的吗?

答案是不一定的,例如以下情况

console.log(2.2 + 2.1)   //输出4.300000000000001

但有时候又是准确的,以下情况

console.log(2.2 + 2.2)   //输出4.4

2.在JS中,整数运算是精确的吗?

答案也是不一定的,例如以下情况

console.log(56464613546554564646 + 1)   //输出56464613546554565000

通过以上两个问题,给大家一个提醒,在对精度要求很高的系统中,或者要小数的运算结果进行比较时,需要特别谨慎,必要时需要进行四舍五入,保留位数

3.在JS中,整数的表示是连续的吗?

答案也是不一定的,对于大多数开发者在生活中,用到的数字可能是连续的,但要是精确的很高的数字,例如某个数是一千亿,有可能下个数字就是一千亿零一或者一千亿零二,是有可能不连续的

4.在JS中,能表示的最大数字是多少?

最大连续整数:表示从1开始数,能数到的最大连续整数,它所在的前一个数是连续的,下一个数也是连续的,就表示最大连续整数。

在浏览器环境中,表示的最大连续整数可以这样来查看,通过查看全局变量window来获取最大连续整数,在浏览器的调试窗口直接输入以下代码,然后会返回最大连续整数

window.Number.MAX_SAFE_INTEGER  //返回9007199254740991

那么在JS中能表示的最大数字是多少呢?

同样是在浏览器的环境下,通过window.Number.MAX_VALUE来查看得知

5.在JS中,能表示的数字最大位数是多少?

在JS中数字能表示的最大位数是不固定的,一般为16~17位,因为表示整数的时候最大为16位,但有可能表示小数的时候为17位,所以是不固定的。

以上问题,你是否认知清楚,如果没有请往下看

在回答以上问题之前,先带大家了解了解二进制

在现实世界中: 十进制,10个数字,逢十进一

在计算机世界中:二进制,2个数字,逢二进一

那么二进制是如何计算的:

二进制转换为十进制,举两个例子  1101和11.01转换为十进制

十进制转换为二进制,同样举个例子  13转换为二进制

13 / 2 商 6 余 1
6 / 2 商 3 余 0
3 / 2 商 1 余 1
1 / 2 商 0 余 1
余数从下往上看

十进制13转换为二进制为-->1101

那么小数转换为二进制呢?请往下看

举个例子3.25 -->

0.25 *    2    0.5    整数部分 : 0
0.5  *    2    1.0    整数部分 :  1
整数部分从上往下看

十进制3.25转换为二进制为-->11.01

小数转换为二进制方法:整数部分同上,小数部分乘2,取小数部分

那么了解二进制后,就可以来回答以上五个问题

为什么JS中小数运算不精确

因为在JS中,十进制的小数,转换成二进制后,可能是无限小数

就比如说十进制的小数0.3转换为二进制为 ------0.0100110011001100....后面是无限位数

0.3*2    0.6    整数部分 : 0
0.6*2    1.2    整数部分 :  1
0.2*2    0.4    整数部分 :  0
0.4*2    0.8    整数部分 :  0
0.8*2    1.6    整数部分 :  1
0.6*2    1.2    整数部分 :  1
0.2*2    0.4    整数部分 :  0
…………
整数部分从上往下看

如何来验证是否是这样的呢,当然可以通过JS中的函数来解决

调用数字中的toString函数,可以转换为二进制,返回结果就是对应的二进制数值

let a = 0.3;
cosnole.log(a.toString(2)); //输出'0.010011001100110011001100110011001100110011001100110011'

后面为啥不写了,因为后面是无限小数,但是计算机的存储能力有限,因此会丢失精度,相当于抛弃一些数据,所以在JS中,小数的存储都是不精确的,才导致小数的相关运算不准确

了解到这些以后,那么又要思考一个问题      JS是怎么存储数字的呢

在JS中,如何存储数字

在计算机标准中,数字存储一般是整数法或者浮点法,但是在神奇的JS中,存储数字的方式都按照浮点法来存储,所以有时候数字运算也是不精确的,因为都是按照小数的方式来存储

那么浮点数是什么   ---浮点数就是使用浮点法存储的数字,可以分为双精度和单精度,在JS中,使用的是双精度来存放浮点数,编号是IEEE 754

JS在计算机中是如何存放数字的

JS在计算机中,给每个数字固定一块内存空间,尺寸固定位64位,例如1,就需要在前面补齐63个0

在计算机中,位(bit)是最小的存储单位,简称位bit
1 byte = 8 bit
1 KB = 1024 byte
1 GB = 1024 MB

那么在计算机中,怎么表示这64位,主要分为三段。类似于

[第一段][第二段][第三段]第一段 : 1位,表示位号位,如果为1,是负数,如果为0,是正数第二段 : 11位,表示指数位,这里的指数是值2位底的指数而不是10第三段 : 52位,表示有效数字
11位的二进制可以表示多个数字1位    2   2^1
2位    4   2^2
3位    8   2^3
…………
11位  2048 2^11

大多数数字,在JS中都是这样存储的

特殊情况

1.指数为0,尾数为0,表示数字 0

2.指数为2047 ,尾数为0,表示为Infinity

0 1111111111 00000000000.......    //-->表示infinity,正无穷

3.符号为1,指数为2047,尾数为0,表示负无穷

0 1111111111 0000000000........    //-->表示-infinity,负无穷

4.指数为2047,尾数不为0,表示NaN

1 11111111111 0100010100…....    //-->表示NaN

对于一个正常的数字,指数部分最多为2046

在JS中,能表示的最大数字

那么通过上面方法,那就能得出在JS中的最大数字

0 111111111111110 111111111111.....    //1.7976931348623157e+308

在JS中,能表示的最大安全整数

什么是安全整数:从1开始到该数字,均是连续的整数,并且该数字的下一个整数是存在的.

0 xxxxx 11111111111……   //安全整数

那从上面可以得出最大的安全整数为2的52次方 - 1为9007199254740991

从上面的文章中可以得出,在JS中,凡是涉及小数运算,就需要警惕精度丢失,第一次写博客,希望有啥写得不好的,大家能提醒我,共勉

在JS中的数字存储问题相关推荐

  1. oracle 判断数字是否为整数,怎么判断JS中一个数字是否为整数?

    怎么判断JS中一个数字是否为整数? 面试的时候遇到的问题,然后小疯回去查就几种方法,姑且一看,请多指正. 方法一: var ss =$("#ss").val(); var sss ...

  2. JS中变量的存储方式 -- 栈和堆

    栈空间和堆空间 JS变量都存储在内存中,而内存给变量开辟了两块存储空间,分别为栈(stack)空间和堆(heap)空间 栈空间:存放JS基本数据类型,通过按值访问,可以直接操作保存在变量中的实际值. ...

  3. js中字符串数字转换为数值类型

    js中将字符串数字转换为数值类型的方法: 1. 使用Number( ) 和String( )这个两个内建函数. var a = 42; var b = String( a ); var c = &qu ...

  4. JS中给数字添加千分符

    一些项目在开发过程中,会遇到给表格.图表中的数字添加千分符的问题,下面分享一个简单实用的函数给大家. const thousands = (str) => {//str 字符类型的数字let t ...

  5. js中做数字运算时出现的异常,期望值比实际值小太多太多

    首先,我遇到的情况不是自定义的数字,而是通过ajax从后端获取的json数据中解析出来的数字. 举个栗子:我想要的结果是 物料差缺率=差缺总数/(差缺总数+齐套总数) //齐套总数 var fullT ...

  6. js中一些常用的基本函数

    如何使用jquery刷新当前页面 下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象 ...

  7. 网站开发中JS中的常用语句

    1.document.write( " "); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document- >html- >(head,body ...

  8. node.js中公培训笔记大全(讲的一般,小白基础入门)

    day01 本阶段的授课内容为 ES6 2天-3天 NodeJS 2天-3天 express 2天-3天 webpack 1天 MySQL数据库 2天 实战项目 2天 今天的授课内容为 1.ES5-严 ...

  9. js中的关键字总结呢

    1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4. ...

  10. js的数据类型--数字

    近期做一些项目的时候发现,自己的js基础还是不够扎实,再看一遍犀牛书,加深自己的理解和印象.所以从这篇文章开始,后面都是关于原生js的一些内容. 这篇文章,我们具体介绍一下js的数据类型其中一种. j ...

最新文章

  1. 二十四、死锁的处理策略---检测和解除
  2. samba mv命令出错
  3. 【转】WinForm窗体间数据交互的方法
  4. SQL Server技术问题之索引优缺点
  5. 十八、前端必学Bootstrap美化(上篇)
  6. Bug关于TP5.1与Swoole使用
  7. mysql增删改查的命令_MySql增删改查命令
  8. Python中Function(函数)和methon(方法)
  9. 从0到1,马蜂窝大交通团队如何构建高效研发流程体系?
  10. python基础知识学习笔记(2)
  11. 博客开张,小小的庆下生^_^
  12. PB如何配置数据源及自带的PB系统
  13. 【ASUS】关于华硕笔记本win7下GTX950M独显驱动无法安装上的解决方法
  14. java中getBytes()方法的使用
  15. 八个处理好职场人际关系的必备技巧
  16. android电视hdmi声音录音,RK3288 android 5.1 HDMI 喇叭同时输出声音
  17. 团队大事件-团队历程-团队记录~
  18. 双系统电脑如何将两个系统安装到一个分区
  19. MyEclipse2014安装包附注册破解包、eclipse安装包
  20. 走进中国8大菜系之——徽菜

热门文章

  1. 鼠标悬停,图片向四周放大效果
  2. 数据分析:OLS回归分析
  3. 立创eda学习笔记二:画pcb板流程(极简入门版)
  4. 有创意的思维导图要怎样绘制
  5. 设计模式1(策略模式)
  6. samba文件共享服务器,全网最详细的samba文件共享服务!
  7. java本地外地号码,将JavaAnpr本地化为本地牌照
  8. 干货!图像集分类大杀器--混合黎曼度量学习
  9. 大白菜无法打开计算机硬盘,大白菜u盘启动盘出现问题及解决办法(上)
  10. C++实现复数矩阵求逆 matlab inv