最近一直在看《你不知道的JS》,看到number
类型,觉得有些东西之前不清楚,轻总结了下。
number类型包括“整数”值和小数值。
但“整数”只是一个没有小数部分的小数值。
TL;DR
number
默认是十进制,并去掉末尾小数部分的0- 二进制、八进制、十六进制:以特殊的
0b 0o 0x
开头 - 非常大或者小的数,可以用指数表示:
5e10
- 严格控制小数的位数:
toFixed
,会四舍五入或补0 - 小数有误差,比较的时候,可以用容差
const isEqual = (n1,n2) => Math.abs( n1 - n2 ) < Number.EPSILON
- JS能表示的最大正负整数是有限的,15位数以内都是很安全的。ID超过15位的时候,记得用字符串。
NaN
是数字类型,但表示”非法数字“,且和自身不相等,但是Number.isNaN(NaN) === true
Infinity
和-Infinity
表示无穷,1/0 === Infinity
,1/InFinity === 0
十进制
默认情况下,大多数 number 将会以十进制小数的形式输出,并去掉末尾小数部分的 0
var a = 42.0;
var b = 42.3000;
a; // 42
b; // 42.3
其他进制的表示方式:尽量小写
- 二进制(0b):
0b11101
- 八进制(0o):
0o11101
- 十六进制(0x):
0x11101
推荐,用小写字母,这样易识别,虽然可以大写,但是0O
可读性低。
指数形式:5E5、toExponential
非常大或者非常小,可以用指数表示。
5E5
是一个number
类型,表示50000
,E表示为10的几次方。
但是toExponential
返回的是string
类型
// 5 * (10^5)
var a = 5E5;
a; // 500000
a.toExponential(); // "5e+10"
限制小数的位数:toFixed
当原来的小数位多于指定的位数,会四舍五入 当原来的小数位少于指定的位数,会补0
但注意,返回值是string
类型
var a = 42.59;
a.toFixed( 0 ); // "43"
a.toFixed( 1 ); // "42.6"
a.toFixed( 3 ); // "42.590"
小数值:小数有误差,比较的时候一定慎重
JS里整数的计算是正确的,但是小数的计算是有误差的。
0.1 + 0.2 === 0.3
// false
JS 的 number 的实现基于“IEEE 754”标准,简单的说,就是小数的表示肯定有误差,只是误差极小。
如果相比较两个小数的话,需使用一个很小的“错误舍入”值作为比较的 容差。这个很小的值经常被称为“机械极小值(machine epsilon)”,大约是为 2^-52
:
function isEqual(n1,n2) {
return Math.abs( n1 - n2 ) < Number.EPSILON;
}
isEqual(0.1+0.2,0.3) // true
安全的整数范围:15位数以下肯定是安全的
JS并不能表示任意位的整数,最大的整数是Number.MAX_SAFE_INTEGER
(9007199254740991),最小的整数是Number.MIN_SAFE_INTEGER
(-9007199254740991)
特别注意,很多ID是超出这个范围的,所以ID最好是用string
,当ID超出**15
**位数的话,就肯定要用字符串类型了。
那超出会怎么样呢,会不准滴!
var a = 9007199254740995
a; // 9007199254740996
测试是不是整数:Number.isInteger
这里我觉得有坑啦,比如希望用户输入整数,别用这个
因为xx.0
,有小数位,但是它觉得就是整数。
Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false
NaN:number类型,表示非正常的数字
NaN 是一种“哨兵值”(一个被赋予了特殊意义的普通的值),试着进行数学操作但是失败了,而这就是失败的 number 结果。
var a = 1/"foo"
a; // NaN
注意:NaN,永远不等于自己。也是JS里唯一自己不等于自己的。
NaN === NaN // false
判断是不是NaN:Number.isNaN
Number.isNaN(1/'foo') // true
Object.is(NaN,NaN) // true
Infinity:表示无穷
数学里,0是不允许做除数的!!!
但是JS里,任意非0的数除以0,值是Infinity
而任意非0的数除以Infinity
,都是0
或者-0
1/0 // Infinity
-1/0 // -Infinity
1/Infinity // 0
-1/Infinity // -0
0 === -0 // true
Object.is(0,-0) // false
虽然-0 === 0
但Object.is(0,-0)是false
,也就是这两并不完全等价,-0
有其本身的意义,比如做动画的时候,表示移动的方向。
不过我觉得大部分开发者,可以忽略,=。=
其他属性和方法
MDN关于Number的介绍。
Number本身也值得一说,其是个函数
- 单独调用,表示将参数转化成数字,无法转化则返回
NaN
- 作为构造函数调用,创建
number
类型的对象 - 作为对象,有其属性和方法
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!