TypeScript 之 Number

工具: PlayeGround

源码: GitHub TypeScript


简介


数字的基本类型是number,它是双精度64位浮点数。支持使用Number对象,它是对原始数值的包装对象。

注:在TypeScript和JavaScript中没有整数

let value_1: number = 0;
let value_2 = new Number("1");
// 0,  Number: 1 
console.log(value_1, value_2); 

Number对象接受的参数类型为: any 如果不能转换为数字, 将返回 NaNnull

const data = new Number("Hello");
console.log(data);									// Number: null 

Number 对象属性相关:

属性名返回类型描述
MAX_VALUEnumber数字的最大数值 1.79E+308 , 不会因操作系统的不同而改变
MIN_VALUEnumber数字的最小数值 5.00E-324 ,不会因操作系统的不同而改变
NaNnumber非数字数值, 即使在相等比较中,自己不等于自己
NEGATIVE_INFINITYnumber负无穷大,小于 MIN_VALUE,溢出时返回该值
POSITIVE_INFINITYnumber正无穷大,大于 MAX_VALUE,溢出时返回该值
toString()string使用指定的基数转换为字符串,基数是[2,36]之间的整数,默认为10
toLocaleString()string把数字转换为字符串, 与tostring有些类似
toFixed()string将数字转换为字符串,并设置小数点后的位数,范围在[0,20]之间, 存在四舍五入的问题
toExponential()string将数字转换为指数计数的字符串,小数点后的位数范围在[0, 20]之间, 存在四舍五入的问题
toPrecision()string将数字转换为指定长度的字符串,有效数字个数在[1,21]之间, 不存在四舍五入的问题
valueOf()number返回Number对象的原始数字值

声明相关:

interface NumberConstructor {
  // 创建Number对象, 参数为any类型
  new(value?: any): Number;
  (value?: any): number;
  readonly prototype: Number;

  // 可表示的最大数值 1.79E+308
  readonly MAX_VALUE: number;
  // 可表示的最小数值 5.00E-324
  readonly MIN_VALUE: number;
  // 非数字数值, 即使在相等比较中,它不等于自己
  readonly NaN: number;
  // 负无穷大,溢出时返回该值。该值小于 MIN_VALUE
  readonly NEGATIVE_INFINITY: number;
  // 正无穷大,溢出时返回该值。该值大于 MAX_VALUE。
  readonly POSITIVE_INFINITY: number;
}

interface Number {
  // 使用指定的基数转换为字符串,基数是[2,36]之间的整数,默认为10
  toString(radix?: number): string;
  // 将数字转换为字符串,并设置小数点后的位数,范围在[0,20]之间
  toFixed(fractionDigits?: number): string;
  // 将数字转换为指数计数的字符串,小数点后的位数范围在[0, 20]之间
  toExponential(fractionDigits?: number): string;
  // 将数字转换为指定长度的字符串,有效数字个数在[1,21]之间
  toPrecision(precision?: number): string;
  // 返回Number对象的原始数字值
  valueOf(): number;
}

interface Number {
  // 把数字转换为字符串,使用本地数字格式顺序
 toLocaleString(locales?: string | string[], options?: Intl.NumberFormatOptions): string;
}

declare var Number: NumberConstructor;

注意事项


对于NaN类型注意:

  • 虽然是number数字类型, 但它真正代表的 非数字数特殊值,用于表示非法的数值
  • 如果两个NaN比较,他们并不相等, 数学运算中较为常见
console.log(0/0);						// NaN 
console.log(Math.sqrt(-1)); // NaN
console.log(Math.log(-1)); 	// NaN

console.log(10 !== NaN);            // true
console.log(NaN == NaN);            // false 

JavaScript和TypeScript存在的 装箱(boxing)拆箱(unboxing) 机制, 我们在使用number基础数据时,无须在通过new 来创建, 对于String对象一样如此:

// numer基础类型
let value = 10;
// Number对象类型
let numObj = new Number(value);

// boxing可以让number和Number对象直接调用对应方法
console.log(value.toString());  // "10"
console.log(numObj.toString()); // "10"

另外Number对象下无穷大的数值给予的结果是: Infinity:

const minValue = Number.NEGATIVE_INFINITY;
const maxValue = Number.POSITIVE_INFINITY;
console.log(minValue);			// -Infinity 
console.log(maxValue);			// Infinity

// 负无穷大小于 MIN_VALUE
console.log(Number.NEGATIVE_INFINITY < Number.MIN_VALUE);       // true
// 正无穷大大于 MAX_VALUE
console.log(Number.POSITIVE_INFINITY > Number.MAX_VALUE);       // true 

实例


  • toString 转换为指定进制字符串, 基数范围[2, 36]
const value = new Number(10);
// 没有基数,则默认十进制
console.log(value.toString());      // 10
// 二进制
console.log(value.toString(2));     // 1010

注: 进制的范围[2, 36]之间,否则报错: toString() radix argument must be between 2 and 36


  • toLocaleStringtoString相比较,在数字四位数的时候比较明显
const value = new Number(1234.56789);
// 直接转换
console.log(value.toString());				// 1234.56789
// 每三位会有逗号间隔
console.log(value.toLocaleString());	// 1,234.568

  • toFixed 转换为保留指定位数小数,小数位数范围在[0,20]
const value = new Number(1.567123);
// 不保留小数
console.log(value.toFixed());           // 2
// 保留两位小数
console.log(value.toFixed(2));          // 1.57

注: 会存在四舍五入的情况


  • toExponential 转换为指数字符串, 小数位数范围在[0, 20]
const value = new Number(12375.73);
// 未设定,则保留所有
console.log(value.toExponential());           // 1.237573e+4
// 保留两位小数, 会存在四舍五入
console.log(value.toExponential(2));          // 1.24e+4

注: 会存在四舍五入的情况


  • toPrecision 转换为指定长度的字符串,有效数字个数范围[1,21]
const value = new Number(1.5367);
// 未设定,则保留所有
console.log(value.toPrecision());           // 1.5367
// 保留两位小数, 不会四舍五入
console.log(value.toPrecision(2));          // 1.5

注:如果对精度要求比较高,推荐使用该方法


  • valueOf 获取原型的number数据
const value = new Number(1234);
console.log(typeof(value));     // "object" 

const num:any = value.valueOf();    
console.log(num, typeof(num));  // 1234,  "number"

ES6特性


  • 二进制和八进制,分别增加了前缀0b/0B0o/0O
console.log(0b1010 === 10); // true
console.log(0o12 === 10); // true
  • Number.EPSILON 的使用, 浮点数的存储和精度问题导致计算机无法精确计算,所以会设置一个很小的误差范围来比对
// 直接比较, 是不相等的
console.log(0.1 + 0.2 === 0.3);     // false 

// 通过Number.EPSILON比对
function isEqual(a:number, b:number) {
    return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1+0.2, 0.3));         // true
console.log(isEqual(0.1+0.2, 0.300001));    // false 
  • 增加了最大/最小安全整数, 范围在 (2^-53, 2^53) 之间
// 最小整数范围下限
const MIN_SAFE = Number.MIN_SAFE_INTEGER;
console.log(MIN_SAFE - 1 === MIN_SAFE - 2);     // true
console.log(MIN_SAFE !== MIN_SAFE + 1);         // true 

// 最大整数范围上限
const MAX_SAFE = Number.MAX_SAFE_INTEGER;
console.log(MAX_SAFE + 1 === MAX_SAFE + 2);     // true 
console.log(MAX_SAFE !== MIN_SAFE - 1);         // true 
  • Number.isFinite() 检查数值是否为有限数字,即不为Infinity
// 基础数字,true 
console.log(Number.isFinite(1));         
// 最小浮点数误差,true               
console.log(Number.isFinite(Number.EPSILON)); 
// 最小值,true 
console.log(Number.isFinite(Number.MIN_VALUE));
// 最大安全整数上限,true 
console.log(Number.isFinite(Number.MAX_SAFE_INTEGER));

// 正无穷大,false
console.log(Number.isFinite(Number.POSITIVE_INFINITY));
// NaN, false 
console.log(Number.isFinite(Number.NaN));
// 注意不存在隐式类型转换,都是false
console.log(Number.isFinite("10"));
console.log(Number.isFinite(undefined));
console.log(Number.isFinite([]));
console.log(Number.isFinite({}));
  • parseInt() 从全局整合到Number中, 它主要用于将字符串转换为指定进制的数字
/*
@funcName: parseInt(string: string, radix?: number | undefined): number
@param: string 转换的字符串
@param: radix: 可选参数进制,范围在[2, 36], 默认十进制
*/
console.log(Number.parseInt("2"));          // 2
console.log(Number.parseInt("12,56"));      // 12
console.log(Number.parseInt("0011",2));     // 3

// 注意:虽然整合了,但本质还是一个同一个函数
console.log(parseInt === Number.parseInt);  // true 

// 注意:无法解析为数字的,会返回NaN
console.log(Number.parseInt("10" + 1));     // 101
console.log(Number.parseInt("abc" + 1));    // NaN 

// 拓展:可使用 isInteger 检测是否为number, 参数为unknown类型
console.log(Number.isInteger(1));       // true 
// 如下一律为false
console.log(Number.isInteger("1"));     
console.log(Number.isInteger(undefined));
console.log(Number.isInteger(NaN));
console.log(Number.isInteger(false));
console.log(Number.isInteger(null));
console.log(Number.isInteger(Infinity));
console.log(Number.isInteger(Number.NEGATIVE_INFINITY));
  • parseFloat() 从全局整合到Number中, 它用于将字符串转换为数字
// 注意参数不能为非string, 否则报错
// console.log(Number.parseFloat([]));
// console.log(Number.parseFloat(undefined));

console.log(Number.parseFloat('123.45'));   // 123.45 
console.log(Number.parseFloat('123.45abc'));// 123.45 
console.log(Number.parseFloat('123abc456'));// 123

// 解析不出来就是NaN
console.log(Number.parseFloat('abc'));      // NaN
  • Math对象增加了一些方法的支持
方法名描述
clz32返回数字的32 位无符号整数形式的前导0的个数
imul返回两个数的32位整数乘积
sign返回一个数的符号,是正数(1)、负数(-1)还是0
log10返回一个数的以10为底的对数
log2返回一个数的以2为底的对数
log1p返回一个数加1的自然对数
expm1返回一个数的自然指数减1
cosh返回一个数的双曲余弦值
sinh返回一个数的双曲正弦值
tanh返回一个数的双曲正切值
acosh返回一个数的反双曲余弦值
asinh返回一个数的反双曲正弦值
atanh返回一个数的反双曲正切值
hypot返回所有参数的平方和的平方根
trunc返回一个数的整数部分
fround返回一个数的最接近的单精度浮点数表示
cbrt返回一个数的立方根//
// imul 计算 a * b 
console.log(Math.imul(2, 3)); // 6                
// sign 判定数字符号,为是正数(1)、负数(-1)还是零
console.log(Math.sign(0));                       // 0
console.log(Math.sign(Number.MAX_VALUE));        // 1
console.log(Math.sign(Number.NEGATIVE_INFINITY));// -1
// hypot 计算 所有参数的平方和的平方根
console.log(Math.hypot(3));     // 3
console.log(Math.hypot(3, 4));  // 5
// trunc 返回数字的整数部分,没有四舍五入
console.log(Math.trunc(0.56));  // 0
console.log(Math.trunc(-1.56)); // -1
// cbrt 返回数字的立方根
console.log(Math.cbrt(8));      // 2
// log10 返回以10为底的对数
console.log(Math.log10(100));   // 2
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹤九日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值