深入理解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 XML操作 封装类
Jul 01 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
Oct 15 Javascript
js bind 函数 使用闭包保存执行上下文
Dec 26 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
JQuery中$(document)是什么意思有什么作用
Jul 21 Javascript
jquery中trigger()无法触发hover事件的解决方法
May 07 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
Oct 11 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
Oct 14 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
Mar 01 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
Jun 18 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 20 Javascript
vue-cli 为项目设置别名的方法
Oct 15 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
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
laravel学习教程之关联模型
2016/07/30 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
2013/11/13 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
超级简单的jquery操作表格方法
2014/12/15 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
JavaScript 身份证号有效验证详解及实例代码
2016/10/20 Javascript
基于Bootstrap仿淘宝分页控件实现代码
2016/11/07 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
2017/07/27 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
2019/11/11 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
浅析Python四种数据类型
2018/09/26 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
Python如何实现定时器功能
2020/05/28 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
竞选班干部的演讲稿
2014/04/24 职场文书
怎样写离婚协议书
2014/09/10 职场文书
幼儿学前班评语
2014/12/29 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python