您的位置: 翼速应用 > 业内知识 > web前端 > 正文

一起聊聊javascript浮点类型

在javascript中,有几种数值类型呢?答案是只有一种,那就是浮点类型。JavaScript内部存储数字都是按64位浮点类型存储的,所以在JavaScript中实际上是没有整数类型的。按照JavaScript中的数字格式能够表示的整数范围为“[-2^53 ~ 2^53]”,包含边界值;但需要注意的是,数组索引、位操作符等使用的是基于32位的整数。


一起聊聊javascript浮点类型



本文适用于windows7系统、javascript1.8.5版、Dell G3电脑。


一起聊聊javascript浮点类型


在JavaScript中实际上是没有整数类型的,数值都是按浮点数来处理,例:


print(3/2); // 1.5


因为JavaScript内部存储数字都是按64位浮点类型存储的,无论整数和小数。容易造成混淆的是,某些位运算必须要整数才可以运行,所以会自动将64位浮点数转化为32位整数。再进行位运算。在JavaScript中,1和1.0是一样的


1 == 1.0 true
0.1+0.2 == 0.3 false
0.3/0.1 = 2.99999999996
(0.3-0.2) === (0.2-0.1) false


按照JavaScript中的数字格式(IEEE-754定义的64位浮点格式),能够表示的整数范围为[-2^53 ~ 2^53],包含边界值。然而需要注意的是,数组索引、位操作符等使用的是基于32位的整数。


浮点数值的最高精度是17位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入误差会导致无法测试特定的浮点数值。


因为二进制浮点数可以精确地表示1/2、1/8等,但不能精确地表示1/10、1/100等。所以像0.1这样的简单数字也不能精确表示。


由于浮点数有精度问题,可能会在比较时得到一此意想不到的结果:


print((0.1+0.2) == 0.3); // false
print(0.1+0.2);          // 0.30000000000000004
print(0.3);              // 0.3
 
print((10/3-3) == (1/3));// false
print(10/3-3);           // 0.3333333333333335
print(1/3);              // 0.3333333333333333


对于整数的情况,只要使用53位以内的整数,则不会出现精度问题,可以放心使用。


除了以十进制表示外,整数还可以通过八进制(以8为基数)或十六进制(以16为基数)的字面值来表示。其中,八进制字面值的第一位必须是零(0),然后是八进制数字序列(0~7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析。


八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误。


十六进制字面值的前两位必须是0x,后跟任何十六进制数字(0~9及A~F)。其中,字母 A~F 可以大写,也可以小写。


由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样地,如果浮点数值本身表示的就是一个整数(如1.0),那么该值也会被转换为整数。


数值对象


与字符串值对应着一个字符串对象一样,数值也有对应的数值对象,即Number。


数值同样可以直接调用数值对应的属性:


print((6).toString()); // 6


注意,本例中,数值需要添加括号,否则句点会被认为是小数点。


Number的使用与String的使用类似,可以进行类型转换、创建数值对象等。


在进行类型转换时,如果转换不成功,即Number返回NaN,使用数值对象时也是如此。


var a = Number('x');
print(typeof a, a);       // number NaN
var b = new Number('x'); 
print(typeof b, b);       // object [Number: NaN]


Number具有5个特殊属性(只读),即:


●  MAX_VALUE :正数最大值,再大就会变成Infinity


●  MIN_VALUE :正数最小值,再小就会变成0


●  NaN :Not a Number


●  NEGATIVE_INFINITY :负无穷大,即-Infinity


●  POSITIVE_INFINITY :正无穷大,即Infinity


print(Number.MAX_VALUE);         // 1.7976931348623157e+308
print(Number.MIN_VALUE);         // 5e-324
print(Number.NaN);               // NaN
print(Number.NEGATIVE_INFINITY); // -Infinity
print(Number.POSITIVE_INFINITY); // Infinity


Infinity


当数字运算结果超过了JavaScript所能表示数字上限时,结果为一个特殊的无穷大值(Infinity),如果是负数的值超过了JavaScript所能表示的负数范围,则结果为-Infinity。


当运算结果无限接近于零并比JavaScript能表示的最小值还小的时候(下溢),结果为0,当负数发生下溢时,结果为-0,正数发生下溢,则结果为+0。


JavaScript预定义了全局变量Infinity和NaN,它们都是只读变量。


由于内存的限制,ECMAScript并不能保存世界上所有的数值。ECMAScript能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。


如果某次计算返回了正或负的Infinity值,那么该值将无法继续参与下一次的计算,因为Infinity不是能够参与计算的数值。要想确定一个数值是不是有穷的(换句话说,是不是位于最小和最大的数值之间),可以使用isFinite()函数。


NaN


NaN是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。


对于NaN,要记住的一点是,只要运算中出现NaN,结果就一定是NaN,就算是"NaN*0"这样的运算,也一样是NaN。只要对NaN运行比较运行,结果就一定是false,就算"NaN==NaN"/"NaN!=NaN"等,都是false。


要判断一个值是否为NaN,可以使用isNaN()函数:


print(isNaN(NaN));  // true
print(isNaN(0/0));  // true


在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。


也可以使用x!==x来判断x是否为NaN,只有在x为NaN的时候,这个表达式的值才为true。


inFinite()


isFinite函数用于判断一个数是否为“正常”的数值:


print(isFinite(Number.NaN));               // false
print(isFinite(Number.NEGATIVE_INFINITY)); // false
print(isFinite(Number.POSITIVE_INFINITY)); // false


除了以上3个特殊值外,其他值的结果都为true


假如x是一个普通数值,则有:


x/0 = Infinity
x%0 = NaN
x/Infinity = 0
x%Infinity = x
0/0 = NaN
0%0 = NaN
Infinity/x = Infinity
Infinity%x = NaN
Infinity/Infinity = NaN
Infinity%Infinity = NaN


完整输出如下:


print(0 / 0);           // NaN
print(3 / 0);           // Infinity
print(Infinity / 0);    // Infinity
print(0 % 0);           // NaN
print(3 % 0);           // NaN
print(Infinity % 0);    // NaN
----------
print(0 / 4);           // 0
print(3 / 4);           // 0.75
print(Infinity / 4);    // Infinity
print(0 % 4);           // 0
print(3 % 4);           // 3
print(Infinity % 4);    // NaN
----------
print(0 / Infinity);           // 0
print(3 / Infinity);           // 0
print(Infinity / Infinity);    // NaN
print(0 % Infinity);           // 0
print(3 % Infinity);           // 3
print(Infinity % Infinity);    // NaN


负零与正零


负零与正零的值相等,不过毕竟带有符号,在一些运算中会有符号方面的差别,比如:


var zero = 0; 
var negz = -0;


此时,zero 等于 negz , 但1/zero 却不等于 1/negz。


关于javascript浮点类型的详细解析就到这里,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题