深入理解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 相关文章推荐
javascript下arguments,caller,callee,call,apply示例及理解
Dec 24 Javascript
javascript Object与Function使用
Jan 11 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
jQuery中读取json文件示例代码
May 10 Javascript
js 获取元素在页面上的偏移量的方法汇总
Apr 13 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
js去字符串前后空格的实现方法
Feb 26 Javascript
详解JavaScript中return的用法
May 08 Javascript
js中el表达式的使用和非空判断方法
Mar 28 Javascript
Vue组件创建和传值的方法
Aug 17 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 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网页标题中文乱码的有效解决方法
2014/03/05 PHP
php简单socket服务器客户端代码实例
2015/05/18 PHP
PHP中类的继承和用法实例分析
2016/05/24 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
基于Jquery的简单图片切换效果
2011/01/06 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
javascript中的Base64、UTF8编码与解码详解
2015/03/18 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
windows 下安装nodejs 环境变量设置
2017/02/02 NodeJs
JavaScript数组迭代方法
2017/03/03 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
小程序实现多选框功能
2018/10/30 Javascript
checkbox在vue中的用法小结
2018/11/13 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
Layui数据表格跳转到指定页的实现方法
2019/09/05 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
[00:57]英雄,你的补给到了!
2020/11/13 DOTA
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python函数嵌套实例
2014/09/23 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python对html过滤处理的方法
2018/10/21 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
打架检讨书300字
2014/02/02 职场文书
护理不良事件检讨书
2014/02/06 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
外贸英文求职信范文
2015/03/19 职场文书
升学宴学生致辞
2015/09/29 职场文书
2016年共产党员公开承诺书
2016/03/24 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
Python开发五子棋小游戏
2022/04/28 Python