# Number

什么是number数据类型?

有效数字(正数、负数、0)NaN(not a number)可以理解为非有效数字

# 声明定义

使用 new 关键字

let num = new Number(5);
console.log(num+5); // 10

new Number(value); 
var a = new Number('123');  // a === 123 is false
var b = Number('123');      // b === 123 is true
a instanceof Number;        // is true
b instanceof Number;        // is false

参数

被创建对象的数字值。

描述

  • 如果参数无法被转换为数字,则返回 NaN。
  • 在非构造器上下文中 (如:没有 new 操作符),Number 能被用来执行类型转换。

# 基本方法

# isNaN()

确定传递的值是否是 NaN。

console.log(Number("houdunren")); //NaN
console.log(2 / 'houdunren'); //NaN

# isInteger()

确定传递的值类型是 Number,且是整数。

console.log(Number.isInteger(1.2));  // false

# toFixed()

指定返回的小数位数可以四舍五入

使用 toFixed 可对数值舍入操作,参数指定保存的小数位

console.log((18.756).toFixed(2)); // 18.76
console.log(1.55236.toFixed(4));  // 1.5524

# isFinite()

确定传递的值类型及本身是否是有限数。

# isSafeInteger()

确定传递的值是否为安全整数 ( -(2^53 - 1) 至 2^53 - 1之间)。

# parseFloat()

和全局对象 parseFloat() 一样

转换字符串为浮点数,忽略字符串前面空白字符。

console.log(parseFloat('  99jc'));	// 99
console.log(parseFloat('18.55'));	  // 18.55

# parseInt()

提示

parseInt(string, radix)

解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。

和全局对象 parseInt() 一样。

提取字符串开始去除空白后的数字转为整数。

console.log(parseInt('  99jc'));	//99
console.log(parseInt('18.55'));	//18

WARNING

const arr = ['1','2','3']
arr.map(parseInt)  // [1, NaN, NaN]

// => 
['1','2','3'].map((val,i)=>parseInt(val,i))
parseInt('1',0)
parseInt('2',1) // 进制不匹配 一进制不存在2
parseInt('3',2) // 进制不匹配 一进制不存在3

# 类型转换

使用Number函数基本上可以转换所有类型

console.log(Number('testString')); //NaN
console.log(Number(true));	//1
console.log(Number(false));	//0
console.log(Number('9'));	//9
console.log(Number([]));	//0
console.log(Number([5]));	//5
console.log(Number([5, 2]));	//NaN
console.log(Number({}));	//NaN

# 浮点精度问题

大部分编程语言在浮点数计算时都会有精度误差问题

let num = 0.1 + 0.2
console.log(num)// 结果:0.30000000000000004

因为计算机以二进制处理数值类型,上面的0.1与0.2转为二进制后是无穷的

console.log((0.1).toString(2)) //0.0001100110011001100110011001100110011001100110011001101
console.log((0.2).toString(2)) //0.001100110011001100110011001100110011001100110011001101

# 处理方式

一种方式使用toFixed 方法进行小数截取

console.log((0.1 + 0.2).toFixed(2)) //0.30
console.log(1.0 - 0.9)              //0.09999999999999998
console.log((1.0 - 0.9).toFixed(2)) //0.10

将小数转为整数进行计算后,再转为小数也可以解决精度问题

Number.prototype.add = function (num) {
	//取两个数值中小数位最大的
  let n1 = this.toString().split('.')[1].length
  let n2 = num.toString().split('.')[1].length
  //得到10的N次幂
  let m = Math.pow(10, Math.max(n1, n2))
  return (this * m + num * m) / m
}
console.log((0.1).add(0.2))

# 推荐做法

市面上已经存在很多针对数学计算的库 mathjs 、decimal.js 等,我们就不需要自己构建了。下面使用 decimal.js 进行浮点计算。

<script src="https://cdn.bootcss.com/decimal.js/10.2.0/decimal.min.js"></script>

<script>
	console.log(Decimal.add(0.1, 0.2).valueOf())
</script>

# 数字千分位的几种方法

# 数字转字符串遍历

思路:数字转字符串,整数部分从低位往高位遍历

  • 1、数字转字符串,字符串按 '.' 分割
  • 2、整数部分拆成字符串数组,并倒叙
  • 3、遍历,每三位添加 ','
  • 4、拼接整数 + 小数部分
const format_with_array = (number) => {
   let arr = (number + '').split('.');
   // 拆分整数部分
   let int = arr[0].split('');
   // 小数部分
   let fraction = arr[1] || '';
   
   let res = ""
   let intlen = int.length;
   // 倒叙遍历
   int.reverse().forEach((item,i)=>{
      // 非第一位并且是位值为3的倍数 添加','
      if(i !== 0 && i % 3 === 0 ){
        res = item + "," + res
      }else{
        res = item + res
      }
   })
   return res + (!!fraction ? '.' + fraction : '')
}

format_with_array(12345678.90)
// '12,345,678.9'

# 使用正则表达式

思路:可以将数字按照整数部分和小数部分分开,然后分别使用正则表达式来匹配每三位数字,并在它们之间插入逗号。

const format_with_regx = num => {
  let [intPart, decPart] = num.toString().split(".");
  intPart = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  if (decPart) {
    decPart = decPart.replace(/(\d{3})/g, "$1,");
    decPart = decPart.replace(/,$/, "");
    return `${intPart}.${decPart}`;
  } else {
    return intPart;
  }
}

let num = 1234567.8901;
format_with_regx(num); // "1,234,567.89"

# 使用 toLocaleString() 方法

可以将小数点后的数字保留指定的位数

let num = 1234567.8901;
let options = { minimumFractionDigits: 2, maximumFractionDigits: 2 };
let formattedNum = num.toLocaleString(undefined, options); // 1,234,567.89"
Last Updated: 3/12/2023, 11:01:17 PM