重新认识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类型的对象
  • 作为对象,有其属性和方法
目录
相关文章
|
6月前
|
存储 JavaScript 安全
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
462 1
el-input的number类型里输入e、+、-符号返回值为空?
el-input的number类型里输入e、+、-符号返回值为空?
409 0
|
1月前
|
存储 Java Apache
Python Number类型详解!
本文详细介绍了 Python 中的数字类型,包括整数(int)、浮点数(float)和复数(complex),并通过示例展示了各种算术操作及其类型转换方法。Python 的 `int` 类型支持任意大小的整数,`float` 类型用于表示实数,而 `complex` 类型用于表示复数。此外,文章还对比了 Python 和 Java 在数字类型处理上的区别,如整数类型、浮点数类型、复数类型及高精度类型,并介绍了各自类型转换的方法。尽管两种语言在语法上有所差异,但其底层逻辑是相通的。通过本文,读者可以更好地理解 Python 的数字类型及其应用场景。
39 2
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS定义布尔值,let flag:boolean = true,定义数字类型 let a1:number = 10,赋值 let str1:string = ‘‘,打印c~.log($(str1))
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
TS,类型注解 number就是类型注解,TS类型注解是一种为变量添加类型约束的方式,你定义什么类型,就只能赋值什么类型,变量命名规则,变量名称不能以数字开头,交换变量写法
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
153 0
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
6月前
|
存储
TS 自定义结构Long与number类型相互转换
TS 自定义结构Long与number类型相互转换
255 0
|
Oracle 关系型数据库 数据库
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
在Flink CDC中,使用Oracle 11g数据库的NUMBER类型作为主键
119 1
|
机器学习/深度学习
计算sum=1+2...+n,要求number和sum的类型都是int,且sum在32位以内~
计算sum=1+2...+n,要求number和sum的类型都是int,且sum在32位以内~

热门文章

最新文章