# 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"
← null和undefined Math →