深入理解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 相关文章推荐
js获取url参数的使用扩展实例
Dec 29 Javascript
Js和JQuery获取鼠标指针坐标的实现代码分享
May 25 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
Nov 07 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
Aug 16 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
Dec 24 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
npm全局模块卸载及默认安装目录修改方法
May 15 Javascript
JavaScript事件冒泡机制原理实例解析
Jan 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中使用与Perl兼容的正则表达式
2006/11/26 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
js删除数组中的元素delete和splice的区别详解
2018/02/03 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
js代码实现轮播图
2020/05/04 Javascript
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
Python中关于浮点数的冷知识
2019/09/22 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
python实现斗地主分牌洗牌
2020/06/22 Python
厨师岗位职责
2013/11/12 职场文书
园艺师求职信
2014/04/27 职场文书
继续教育个人总结
2015/03/03 职场文书
实习护士自荐信
2015/03/25 职场文书
走进科学观后感
2015/06/18 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
详解Java实践之适配器模式
2021/06/18 Java/Android
logback如何自定义日志存储
2021/08/30 Java/Android
Python游戏开发实例之graphics实现AI五子棋
2021/11/01 Python
Golang数据类型和相互转换
2022/04/12 Golang