重新认识number类型

简介: 重新认识number类型

重新认识number类型


最近一直在看《你不知道的JS》,看到number类型,觉得有些东西之前不清楚,轻总结了下。

number类型包括“整数”值和小数值。

但“整数”只是一个没有小数部分的小数值

JS 没有真正的整数,也就是说,42.0 和 42 一样是“整数”

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 === Infinity1/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 === 0Object.is(0,-0)是false,也就是这两并不完全等价,-0有其本身的意义,比如做动画的时候,表示移动的方向。 不过我觉得大部分开发者,可以忽略,=。=

Object.is很大程度上是为这些特殊的等价情况准备的,0和-0,NaN和NaN。

其他属性和方法

网络异常,图片无法展示
|

MDN关于Number的介绍。

Number本身也值得一说,其是个函数

  • 单独调用,表示将参数转化成数字,无法转化则返回NaN
  • 作为构造函数调用,创建number类型的对象
  • 作为对象,有其属性和方法
目录
相关文章
|
4月前
|
存储 JavaScript 安全
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
207 1
el-input的number类型里输入e、+、-符号返回值为空?
el-input的number类型里输入e、+、-符号返回值为空?
239 0
|
1月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
|
5月前
|
Oracle 关系型数据库 数据库
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
48 1
|
6月前
|
机器学习/深度学习
计算sum=1+2...+n,要求number和sum的类型都是int,且sum在32位以内~
计算sum=1+2...+n,要求number和sum的类型都是int,且sum在32位以内~
|
8月前
|
JavaScript
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
ES6对String字符串、Array数组、Number数字、Object对象 类型做了哪些升级优化
|
8月前
|
JavaScript
TypeScript 与 JS 中类型首字母大小写区别(String、string、Number、number、Boolean、boolean ...)
TypeScript 与 JS 中类型首字母大小写区别(String、string、Number、number、Boolean、boolean ...)
171 0
|
索引
Ts中string、number和any等类型 不能当做索引用,怎么处理?
Ts中string、number和any等类型 不能当做索引用,怎么处理?
290 0
|
JavaScript Java Unix
vue 里怎么通过魔数(magic number)去限制上传文件类型?
vue 里怎么通过魔数(magic number)去限制上传文件类型?
393 0
vue 里怎么通过魔数(magic number)去限制上传文件类型?