function toNonExponential(num) {
var m = num.toExponential().match(/\d(?:\.(\d*))?e([+-]\d+)/);
return num.toFixed(Math.max(0, (m[1] || '').length - m[2]));
}
console.log(toNonExponential(1.23e+10)); // "12300000000"
console.log(toNonExponential(4.56e-5)); // "0.0000456"
这段代码用到了正则表达式和 toFixed
,通过 toExponential
拿到科学计数法表示,再解析指数部分,计算需要保留的位数。
实际上,还有一种更简单的方式
function toNonExponentialSimplified(num) {
return num.toLocaleString('fullwide', { useGrouping: false });
}
console.log(toNonExponentialSimplified(1.23e+10)); // "12300000000"
console.log(toNonExponentialSimplified(4.56e-5)); // "0.0000456"
toLocaleString
是一个强大的方法,它不仅能处理科学计数法,还能直接返回不带逗号分隔的完整数字字符串。只要设置 { useGrouping: false }
,就能避免默认的千分位分隔符,非常简洁。
在这里顺道说一下JS中原生数字格式化工具
很多人对 Number.prototype
提供的 toExponential
、toFixed
和 toPrecision
了解得不够深入,这些方法各有妙用。
-
toExponential([fractionDigits])这个方法将数字按科学计数法返回,并可以指定保留的小数位数。 适合处理需要科学计数法表示的场景,比如天文学中的大数。
let num = 123456; console.log(num.toExponential(2)); // "1.23e+5" console.log(num.toExponential(4)); // "1.2346e+5"
-
toFixed([fractionDigits])按指定的小数位数返回字符串,直接四舍五入。
let num = 123.45678; console.log(num.toFixed(2)); // "123.46" console.log(num.toFixed(0)); // "123"
注意:这个方法返回的是字符串而不是数字。如果需要保留精度的同时保持类型为数字,可以再包一层
parseFloat
。 -
toPrecision([precision])根据总有效位数返回格式化字符串。它不仅关注小数点后,还包括小数点前的位数。
let num = 123.45678; console.log(num.toPrecision(2)); // "1.2e+2" console.log(num.toPrecision(6)); // "123.457"
适合处理需要总有效位数控制的场景。