深入理解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 table鼠标经过变色代码
Sep 27 Javascript
jQuery获取选中内容及设置元素属性的方法
Jul 09 Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
JS模拟实现方法重载示例
Aug 03 Javascript
详解Node.js项目APM监控之New Relic
May 12 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
vue组件系列之TagsInput详解
May 14 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使用内置函数生成图片的方法详解
2016/05/09 PHP
php排序算法实例分析
2016/10/17 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
JS使用正则表达式验证身份证号码
2017/06/23 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
使用 Node.js 开发资讯爬虫流程
2018/01/07 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
python sort、sorted高级排序技巧
2014/11/21 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
Python实现手势识别
2020/10/21 Python
八年级历史教学反思
2014/01/10 职场文书
中学生获奖感言
2014/02/04 职场文书
工作表现自我评价
2014/02/08 职场文书
幼儿评语大全
2014/04/30 职场文书
投标邀请书范本
2015/02/02 职场文书
技术员个人工作总结
2015/03/03 职场文书
人生遥控器观后感
2015/06/11 职场文书
读书笔记怎么写
2015/07/01 职场文书
团结友爱主题班会
2015/08/13 职场文书
JS Object构造函数之Object.freeze
2021/04/28 Javascript