一、 arr.map(parseInt)
示例:
console.log(['1', '2', '3'].map(parseInt))
//1
//NaN
//NaN
解析:
parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。
map() 方法创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
接收2个参数:1.回调函数:接收3个返回值,分别是正在处理的当前元素(必须),当前元素索引(可选),map方法调用的数组(可选)。2.执行回调函数时的this(可选),形式如下:
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
有上述可知:
['1', '2', '3'].map(parseInt)
//等效于:
parseInt(1, 0, ['1', '2', '3'])
parseInt(2, 1, ['1', '2', '3'])
parseInt(3, 2, ['1', '2', '3'])
如果看到这里还不太理解那么把parseInt
换成自定义函数parse
继续往下看相信你会豁然开朗:
let arr = ['1', '2', '3']
console.log(arr.map(parse))
function parse(param1, param2, param3) {
return parseInt(param1, param2)
}
二 0.1+0.2不等于0.3的问题
1.问题
console.log(0.1 + 0.2) //0.30000000000000004
2. 分析
由于计算机底层存储都是基于二进制的,需要事先由十进制转换为二进制存储与运算,这整个转换过程中,类似于 0.1、0.2 这样的数是无穷尽的,无法用二进制数精确表示。JavaScript 采用的是 IEEE 754 双精确度标准,能够有效存储的位数为 52 位,所以就需要做舍入操作,这无可避免的会引起精度丢失。另外我们在 0.1 与 0.2 相加做对阶、求和、舍入过程中也会产生精度的丢失。
关于浮点数运算的底层逻辑参考该文档。
3. 解决方案
使用BigNumber.js,一个用于任意精度计算的js库。大概原理是将所有数字当做字符串,重新实现了计算逻辑。缺点是性能比原生的差很多。
let x = new BigNumber(0.1)
let y = 0.2
console.log(parseFloat(x.plus(y)))//0.3
4.附BigNumber.js常用方法
// 转为 bignumber
const x= new BigNumber('123456789.123456789');
// 转为 普通数字
x.toNumber()
// 格式化(小数点)
x.toFormat() // '123,456,789.123456789'
x.toFormat(3) // '123,456,789.123'
// 计算
x.plus(0.1) // 加法
x.minus(0.1) // 减法
x.times(0.1) // 乘法
x.div(0.1) // 除法
x.mod(3) // 取模/取余
// 比较大小
x.eq(y) // isEqualTo 的简写,是否相等
Future home of x.gt(y) // isGreaterThan 的简写,是否大于
x.gte(y) // isGreaterThanOrEqualTo 的简写,是否大于等于
x.lt(y) // isLessThan 的简写,是否小于
x.lte(y) // isLessThanOrEqualTo 的简写,是否小于等于
// 取非,改变数字的正负号
x.negated()
网友评论