深入理解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 插件开发方法小结
Oct 23 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
Aug 24 Javascript
简单的分页代码js实现
May 17 Javascript
浅析JavaScript中作用域和作用域链
Dec 06 Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
Mar 24 jQuery
JS获取字符对应的ASCII码实例
Sep 10 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
Sep 21 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
Jan 19 Javascript
javascript的var与let,const之间的区别详解
Feb 18 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
2019十大人气国漫
2020/03/13 国漫
我常用的几个类
2006/10/09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
php实现Session存储到Redis
2015/11/11 PHP
浅谈PHP命令执行php文件需要注意的问题
2016/12/16 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jquery实现弹出层遮罩效果的简单实例
2014/03/03 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
python获取一组数据里最大值max函数用法实例
2015/05/26 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
Python中修改字符串的四种方法
2018/11/02 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
浅谈HTML5 & CSS3的新交互特性
2016/07/19 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
Nike台湾官方商店:Nike.com (TW)
2017/08/16 全球购物
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
统计岗位职责
2014/02/21 职场文书
社区工作者感言
2014/03/02 职场文书
蛋糕店创业计划书
2014/05/06 职场文书
六一亲子活动总结
2014/07/01 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
离婚协议书范本
2015/01/26 职场文书
岗位聘任协议书
2015/09/21 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书