深入理解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 相关文章推荐
jQuery数组处理代码详解(含实例演示)
Feb 03 Javascript
JavaScript之引用类型介绍
Aug 10 Javascript
jquery自定义滚动条插件示例分享
Feb 21 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
js实现砖头在页面拖拉效果
Nov 20 Javascript
Bootstrap轮播图的使用和理解4
Dec 14 Javascript
解决ztree搜索中多级菜单展示不全问题
Jul 05 Javascript
Vue.js 利用v-for中的index值实现隔行变色
Aug 01 Javascript
微信小程序实现的绘制table表格功能示例
Apr 26 Javascript
微信小程序前端promise封装代码实例
Aug 24 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 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创建动态图像
2006/10/09 PHP
php实现购物车功能(下)
2016/01/05 PHP
php数据访问之增删改查操作
2016/05/09 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
jQuery基础框架浅入剖析
2012/12/27 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
python3 sorted 如何实现自定义排序标准
2020/03/12 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
Ado与Ado.net的相同与不同
2014/12/08 面试题
业务主管岗位职责范本
2013/12/25 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
营销学习心得体会
2014/09/12 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
违纪检讨书
2015/01/27 职场文书
个人学习总结范文
2015/02/15 职场文书
专家推荐信怎么写
2015/03/25 职场文书
销售经理岗位职责范本
2015/04/02 职场文书