深入理解JavaScript中的浮点数


Posted in Javascript onMay 18, 2016

js只有一种数值型数据类型,不管是整数还是浮点数,js都把归为数字。

typeof 17;   // “number”

typeof 98.6; // “number”

typeof ?2.1; // “number”

js中的所有数字都是双精度浮点数。是由IEEE754标准制定的64位编码数字(这个是什么东东,不知道,回头查一下吧)

那么js是如何表达整数的,双精度浮点数可以完美地表示高达53位精度的整数(没有什么概念,没处理过多大的数据,没用完过!),从-9007199254740992(-253)到9007199254740992(253)的所有整数都是有效的双精度浮点数。

大多数算术运算符都可以使用整数、实数或两者的组合进行计算。

0.1*1.9    //0.19

-99+100  //1

21-12.3  //8.7

2.5/5   //0.5

21%8  //5

算术运算符比较特殊,js不会直接将操作数作为浮点数进行计算,而是将其隐式转换为32位整数后进行运算。(确切的说,会被转换为32位大端(big-endian)的2的补码表示的整数(实话说这里真的不知道是什么意思,求科普))以按位或运算表达式为

例:

8|1; //9

运算过程

首先8和1是双精度的浮点数。但也可以表示为32位整数,即32位的二进制表示。

整数8表示为32位二进制为:

0000 0000 0000 0000 0000 0000 0000 1000

也可能过

(8).toString(2); //”1000”

toString的参数是转换基数

(下面是我试的以其它基数转换的,和本文无关)

(8).toString(8); //”10”

(8).toString(16); //”8”

整数1表示为32位二进制为:

0000 0000 0000 0000 0000 0000 0000 0001

运行按位或

0000 0000 0000 0000 0000 0000 0000 1000

0000 0000 0000 0000 0000 0000 0000 0001

--------------------------------------------

0000 0000 0000 0000 0000 0000 0000 1001

同样的使用标准库函数parseInt验证,同样以2作为基数,前导0不影响运算结果,不必要。

parseInt('1001',2) //9

(下面是我试的以其它基数转换的,和本文无关)

parseInt('1001',8) //513

parseInt('1001',16) //4097

总结算术运算的过程就是,将操作数转换为整数,然后使用整数位模式进行运算,最后将结果转换为标准的js浮点数。

浮点数的警示:出了名的不精确。比如

0.1+0.2; //0.30000000000000004

原因:尽管64位浮点数精度已经很高,但双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。当你执行一系列的运算,随着舍入误差的积累,运算结果会越来越不精确。舍入也使算术运算定律产生一些偏差。例如结合律。对于任意实数

x,y,z总满足(x+y)+z=x+(y+z)

浮点数就不一定:

(0.1+0.2)+0.3; //0.6000000000000001

0.1+(0.2+0.3); //0.6

浮点数权衡了精度和性能,关心精度时,要小心浮点数的局限性。

解决办法就是把浮点运算转化为整数运算。

(10+20)+30; //60

10+(20+30); //60

然后再除少放大倍数。要注意整数范围要在-253~253内。

总结

1、js的数字都是双精度的浮点数

2、js的整数仅仅是双精度浮点数的一个子集,不是单独的一个类型

3、位运算将数字视为32位的有符号整数

4、当心浮点运算的精度问题

以上这篇深入理解JavaScript中的浮点数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
Feb 03 Javascript
jQuery的DOM操作之删除节点示例
Jan 03 Javascript
纯JavaScript代码实现文本比较工具
Feb 17 Javascript
IE和Firefox之间在JavaScript语法上的差异
Apr 22 Javascript
Node.js安装配置图文教程
May 10 Javascript
Angular5.1新功能分享
Dec 21 Javascript
JavaScript中call和apply方法的区别实例分析
Aug 03 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
May 14 jQuery
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
Jun 06 jQuery
ES6 Symbol数据类型的应用实例分析
Jun 26 Javascript
原生js+ajax分页组件
Jan 30 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
Node.js返回JSONP详解
May 18 #Javascript
noty ? jQuery通知插件全面解析
May 18 #Javascript
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
May 18 #Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 #Javascript
JavaScript 基础函数_深入剖析变量和作用域
May 18 #Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 #Javascript
深入理解JQuery中的事件与动画
May 18 #Javascript
You might like
php使用fopen创建utf8编码文件的方法
2014/10/31 PHP
PHP正则删除HTML代码中宽高样式的方法
2017/06/12 PHP
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
javascript数组去掉重复
2011/05/12 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
JS模板实现方法
2013/04/03 Javascript
XMLHttpRequest处理xml格式的返回数据(示例代码)
2013/11/21 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
JS实现音乐导航特效
2020/01/06 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
python模块如何查看
2020/06/16 Python
python一些性能分析的技巧
2020/08/30 Python
Python基于template实现字符串替换
2020/11/27 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
高中数学教师求职信
2013/10/30 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
教师专业自荐信
2014/05/31 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript
Vue Element plus使用方法梳理
2022/12/24 Vue.js