跟我学习javascript的浮点数精度


Posted in Javascript onNovember 16, 2015

大多数编程语言都有几种数值型数据类型,但是JavaScript却只有一种。你可以使用typeof 运算符查看数字的类型。不管是整数还是浮点数,JavaScript都将它们简单地归类为数字。

typeof 17; //number
typeof 98.6; //number
typeof -21.3; //number

事实上,JavaScript中所有的数字都是双精度浮点数。这是由IEEE754标准制定的64位编码数字——即“doubles”。如果这一事实使你疑惑JavaScript是如何表示整数的,请记住,双精度浮点数能完美地表示高达53位精度的整数。从?9 007 199 254 740 992(?253)到9 007 199 254 740 992(253)的所有整数都是有效的双精度浮点数。因此,尽管JavaScript中缺少明显的整数类型,但是完全可以进行整数运算。
大多数的算术运算符可以使用整数、实数或两者的组合进行计算。

0.1 * 0.9; //0.19
-99 + 100; //1
21- 12.3; //8.7
2.5 /5; //0.5
21%8; //5

然而位算术运算符比较特殊。JavaScript不会直接将操作数作为浮点数进行运算,而是会将其隐式地转换为32位整数后进行运算。(确切地说,它们被转换为32位大端(big-endian)的2的补码表示的整数。)以按位或运算表达式为例:

8|1; //9

看似简单的表达式实际上需要几个步骤来完成运算。如前所述,JavaScript中的数字8和1都是双精度浮点数。但是它们也可以表示成32位整数,即32位0、1的序列。整数8表示为32位二进制序列如下所示:

00000000000000000000000000001000

你自己也可以使用数字类型的toString方法来查看:

(8).toString(2)  //"1000"

toString方法的参数指定了其转换基数,此例子以基数2(即二进制)表示。结果值省略了左端多余的0(位),因为它们并不影响最终值。
整数1表示为32位二进制如下所示:

00000000000000000000000000000001

按位或运算表达式合并两个比特序列。只要参与运算的两位比特中任意一位为1,运算结果的该位就为1。以位模式表示的结果如下:

00000000000000000000000000001001

这个序列表示整数9。你可以使用标准的库函数parseInt验证,同样以2作为基数:

parseInt("1000", 2); //9

(同样,前导0位是不必要的,因为它们并不影响运算结果。)
所有位运算符的工作方式都是相同的。它们将操作数转换为整数,然后使用整数位模式进行运算,最后将结果转换为标准的JavaScript浮点数。一般情况下,JavaScript引擎需要做些额外的工作来进行这些转换。因为数字是以浮点数存储的,必须将其转换为整数,然后再转换回浮点数。然而,在某些情况下,算术表达式甚至变量只能使用整数参与运算,优化编译器有时候可以推断出这些情形而在内部将数字以整数的方式存储以避免多余的转换。

关于浮点数的最后警示是,你应该对它们保持时刻警惕。浮点数看似熟悉,但是它们是出了名的不精确。甚至一些看起来最简单的算术运算都会产生不正确的结果。

0.1+0.2; 0.300000000000004

尽管64位的精度已经相当高了,但是双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。当你执行一系列的运算,随着舍入误差的积累,运算结果会越来越不精确。舍入也会使我们通常所期望的算术运算定律产生一些出人意料的偏差。例如,实数满足结合律,这意味着,对于任意的实数x,y,z,总是满足(x + y) + z = x + (y + z)。

然而,对于浮点数来说,却并不总是这样。

(0.1+0.2)+0.3; //0.60000000000000001
0.1+(0.2+ 0.3); //0.6

浮点数权衡了精度和性能。当我们关心精度时,要小心浮点数的局限性。一个有效的解决方法是尽可能地采用整数值运算,因为整数在表示时不需要舍入。当进行货币相关的计算时,程序员通常会按比例将数值转换为最小的货币单位来表示再进行计算,这样就可以以整数进行计算。例如,如果上面的计算是以美元为单位,那么,我们可以将其转换为整数表示的美分进行计算。

(10+20)+30; //60
10+ (20+30); //60

对于整数运算,你不必担心舍入误差,但是你还是要当心所有的计算只适用于?253~253的整数。

提示

  • JavaScript的数字都是双精度的浮点数。
  • JavaScript中的整数仅仅是双精度浮点数的一个子集,而不是一个单独的数据类型
  • 位运算符将数字视为32位的有符号整数。

以上就是介绍的javascript的浮点数,我们要时刻注意浮点运算中的精度陷阱,希望这篇文章对大家的学习有所帮助。

Javascript 相关文章推荐
动态加载iframe
Jun 16 Javascript
js读取配置文件自写
Feb 11 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
原生js与jQuery实现简单的tab切换特效对比
Jul 30 Javascript
无需 Flash 使用 jQuery 复制文字到剪贴板
Apr 26 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
微信小程序发送短信验证码完整实例
Jan 07 Javascript
js实现坦克移动小游戏
Oct 28 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 Javascript
element多个表单校验的实现
May 27 Javascript
跟我学习javascript的严格模式
Nov 16 #Javascript
javascript中tostring()和valueof()的用法及两者的区别
Nov 16 #Javascript
关于javascript中dataset的问题小结
Nov 16 #Javascript
javascript入门教程基础篇
Nov 16 #Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 #Javascript
浅谈JavaScript中的对象及Promise对象的实现
Nov 15 #Javascript
javascript 中的 delete及delete运算符
Nov 15 #Javascript
You might like
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
python简单商城购物车实例代码
2018/03/15 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
python 产生token及token验证的方法
2018/12/26 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
python的slice notation的特殊用法详解
2019/12/27 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
纯CSS3制作的鼠标悬停时边框旋转
2017/01/03 HTML / CSS
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
Otticanet美国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
瑞典香水、须后水和美容产品购物网站:Parfym-Klick.se
2019/12/29 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
大学信息公开实施方案
2014/03/09 职场文书
三爱活动实施方案
2014/03/19 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
设计专业自荐信
2014/06/19 职场文书
毕业生工作求职信
2014/06/30 职场文书
个人优缺点总结
2015/02/28 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
教师节获奖感言
2015/07/31 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书