javascript
javascript 判断为负数-ag凯发k8国际
今天的重点,是数值(number)对象。
1 概念
number对象是数值对应的包装对象,可以作为构造函数使用,也可以作为工具函数使用。
作为构造函数时,它用于生成值为数值的对象:
上面代码中,number对象作为构造函数使用,返回一个值为1的对象。
作为工具函数时,它可以将任何类型的值转为数值:
上面代码将布尔值false转为数值0。
2 静态属性
number对象拥有以下一些静态属性(即直接定义在number对象上的属性,而不是定义在实例上的属性)。
- number.positive_infinity:正的无限,指向infinity。
- number.negative_infinity:负的无限,指向-infinity。
- number.nan:表示非数值,指向nan。
- number.min_value:表示最小的正数(即最接近0的正数,在64位浮点数体系中为5e-324),相应的,最接近0的负数为-number.min_value。
- number.max_safe_integer:表示能够精确表示的最大整数,即9007199254740991。
- number.min_safe_integer:表示能够精确表示的最小整数,即-9007199254740991。
es 6 在number对象上面,新增一个极小的常量number.epsilon。根据规格,它表示 1 与大于 1 的最小浮点数之间的差。
对于 64 位浮点数来说,大于 1 的最小浮点数相当于二进制的1.00..001,小数点后面有连续 51 个零。这个值减去 1 之后,就等于 2 的 -52 次方。
number.epsilon实际上是 javascript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。
引入一个这么小的量的目的,在于为浮点数计算,设置一个误差范围。我们知道浮点数计算是不精确的:
上面代码解释了,为什么比较0.1 0.2与0.3得到的结果是false。
number.epsilon可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即number.epsilon * math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等:
因此,number.epsilon的实质是一个可以接受的最小误差范围:
上面的代码为浮点数运算,部署了一个误差检查函数。
3 实例方法
在es 5时代,number对象有5个实例方法,都跟将数值转换成指定格式有关;在es 6标准发布之后,又增补了几种方法,下面一一介绍到。
3.1 number.prototype.tostring()
number对象部署了自己的tostring方法,用来将一个数值转为字符串形式:
tostring方法可以接受一个参数,表示输出的进制。如果省略这个参数,默认将数值先转为十进制,再输出字符串;否则,就根据参数指定的进制,将一个数字转化成某个进制的字符串:
上面代码中,345一定要放在括号里,这样表明后面的点表示调用对象属性。如果不加括号,这个点会被 javascript 引擎解释成小数点,从而报错:
只要能够让 javascript 引擎不混淆小数点和对象的点运算符,各种写法都能用。除了为345加上括号,还可以在345后面加两个点,javascript 会把第一个点理解成小数点(即345.0),把第二个点理解成调用对象属性,从而得到正确结果;同理,空格加上一个点,或者正数变为小数都是可以的:
这实际上意味着,可以直接对一个小数使用tostring方法:
通过方括号运算符也可以调用tostring方法:
tostring方法只能将十进制的数,转为其他进制的字符串。如果要将其他进制的数,转回十进制,需要使用parseint方法。
3.2 number.prototype.tofixed()
tofixed()方法先将一个数转为指定位数的小数,然后返回这个小数对应的字符串:
上面代码中,345和345.008先转成2位小数,然后转成字符串。其中345必须放在括号里,否则后面的点会被处理成小数点。
tofixed()方法的参数为小数位数,有效范围为0到100,超出这个范围将抛出 rangeerror 错误。
由于浮点数的原因,小数5的四舍五入是不确定的,使用的时候必须小心:
3.3 number.prototype.toexponential()
toexponential方法用于将一个数转为科学计数法形式:
toexponential方法的参数是小数点后有效数字的位数,范围为0到100,超出这个范围,会抛出一个 rangeerror 错误。
3.4 number.prototype.toprecision()
number.prototype.toprecision()方法用于将一个数转为指定位数的有效数字:
该方法的参数为有效数字的位数,范围是1到100,超出这个范围会抛出 rangeerror 错误。
该方法用于四舍五入时不太可靠,跟浮点数不是精确储存有关:
3.5 number.prototype.tolocalestring()
number.prototype.tolocalestring()方法接受一个地区码作为参数,返回一个字符串,表示当前数字在该地区的当地书写形式:
该方法还可以接受第二个参数配置对象,用来定制指定用途的返回字符串。该对象的style属性指定输出样式,默认值是decimal,表示输出十进制形式。如果值为percent,表示输出百分数:
如果style属性的值为currency,则可以搭配currency属性,输出指定格式的货币字符串形式:
如果number.prototype.tolocalestring()省略了参数,则由浏览器自行决定如何处理,通常会使用操作系统的地区设定。注意,该方法如果使用浏览器不认识的地区码,会抛出一个错误:
3.6 number.isfinite(), number.isnan()
es 6 在number对象上,新提供了number.isfinite()和number.isnan()两个方法。
number.isfinite()用来检查一个数值是否为有限的(finite),即不是infinity。
注意,如果参数类型不是数值,number.isfinite一律返回false。
number.isnan()用来检查一个值是否为nan:
如果参数类型不是nan,number.isnan一律返回false。
它们与传统的全局方法isfinite()和isnan()的区别在于,传统方法先调用number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,number.isfinite()对于非数值一律返回false, number.isnan()只有对于nan才返回true,非nan一律返回false。
3.7 number.parseint(), number.parsefloat()
es 6 将全局方法parseint()和parsefloat(),移植到number对象上面,行为完全保持不变:
这样做的目的,是逐步减少全局性方法,使得语言逐步模块化:
3.8 number.isinteger()
number.isinteger()用来判断一个数值是否为整数:
javascript 内部,整数和浮点数采用的是同样的储存方法,所以 345 和 345.0 被视为同一个值:
如果参数不是数值,number.isinteger返回false:
注意,由于 javascript 采用 ieee 754 标准,数值存储为64位双精度格式,数值精度最多可以达到 53 个二进制位(1 个隐藏位与 52 个有效位)。如果数值的精度超过这个限度,第54位及后面的位就会被丢弃,这种情况下,number.isinteger可能会误判:
上面代码中,number.isinteger的参数明明不是整数,但是会返回true。原因就是这个小数的精度达到了小数点后16个十进制位,转成二进制位超过了53个二进制位,导致最后的那个3被丢弃了。
类似的情况还有,如果一个数值的绝对值小于number.min_value(5e-324),即小于 javascript 能够分辨的最小值,会被自动转为 0。这时,number.isinteger也会误判:
上面代码中,5e-325由于值太小,会被自动转为0,因此返回true。
总之,如果对数据精度的要求较高,不建议使用number.isinteger()判断一个数值是否为整数。
3.9 安全整数和 number.issafeinteger()
javascript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值:
上面代码中,超出 2 的 53 次方之后,一个数就不精确了。
number.issafeinteger()则是用来判断一个整数是否落在这个范围之内:
这个函数的实现很简单,就是跟安全整数的两个边界值比较一下。
number.issafeinteger = function (n) {return (typeof n === 'number' &&math.round(n) === n &&number.min_safe_integer <= n &&n <= number.max_safe_integer); }实际使用这个函数时,需要注意。验证运算结果是否落在安全整数的范围内,不要只验证运算结果,而要同时验证参与运算的每个值:
上面代码中,9007199254740993不是一个安全整数,但是number.issafeinteger会返回结果,显示计算结果是安全的。这是因为,这个数超出了精度范围,导致在计算机内部,以9007199254740992的形式储存:
所以,如果只验证运算结果是否为安全整数,很可能得到错误结果。下面的函数可以同时验证两个运算数和运算结果:
4 自定义方法
与其他对象一样,number.prototype对象上面可以自定义方法,被number的实例继承:
上面代码为number对象实例定义了一个add方法。在数值上调用某个方法,数值会自动转为number的实例对象,所以就可以调用add方法了。由于add方法返回的还是数值,所以可以链式运算:
上面代码在number对象的实例上部署了subtract方法,它可以与add方法链式调用。
我们还可以部署更复杂的方法:
上面代码在number对象的原型上部署了iterate方法,将一个数值自动遍历为一个数组。
注意,数值的自定义方法,只能定义在它的原型对象number.prototype上面,数值本身是无法自定义属性的:
上面代码中,n是一个原始类型的数值。直接在它上面新增一个属性x,不会报错,但毫无作用,总是返回undefined。这是因为一旦被调用属性,n就自动转为number的实例对象,调用结束后,该对象自动销毁。所以,下一次调用n的属性时,实际取到的是另一个对象,属性x当然就读不出来。
总结
以上是ag凯发k8国际为你收集整理的javascript 判断为负数_javascript从零开始——标准库(7)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: