我正在处理浮点数,需要在宽度有限的网页小部件上显示它们。我大部分的浮点数都使用tofixed(2)。但是在某些情况下,存在诸如0.0000000365468
之类的数字,因为tofixed(2)仅打印0.00
。我不能将其永久设置为tofixed(8),因为在正常情况下会占用太多空间。
javascript / jquery中是否有任何内置功能,我可以自动将数字四舍五入到最接近的有意义数字(在上述情况下,0.00000003
或0.00000004
准确地说)?
答案 0 :(得分:5)
您可以获取log 10 并使用阈值获取该值。
function f(x) {
return x.toFixed(Math.log10(x) < -2 ? 8 : 2);
}
console.log(f(0.0000000365468));
console.log(f(0.000000365468));
console.log(f(0.00000365468));
console.log(f(0.0000365468));
console.log(f(0.000365468));
console.log(f(0.00365468));
console.log(f(0.0365468));
console.log(f(12.34));
动态方法
function f(x) {
return x.toFixed(Math.max(-Math.log10(x) + 1, 2));
}
console.log(f(0.0000000365468));
console.log(f(0.000000365468));
console.log(f(0.00000365468));
console.log(f(0.0000365468));
console.log(f(0.000365468));
console.log(f(0.00365468));
console.log(f(0.0365468));
console.log(f(12.34));
答案 1 :(得分:3)
与性能代码相比,我通常更喜欢可读性更好的代码,所以这是我的2美分。
我正在使用递归将数字修整到2个小数位(如果它不为零),如果不是,则返回,我增加了小数位数,这也为我们舍入了数字:)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
const arr = [0.34, 0.567, 0.000045, 0.0000066, 0.000044]
console.log(arr.map(trimNumber))
function trimNumber(number, points = 2) {
const trimmed = number.toFixed(points);
if (trimmed != 0) return trimmed;
return trimNumber(number, points + 1);
}
答案 2 :(得分:2)
我认为您可以只使用Number原型方法toPrecision。它也返回一个非常适合您目的的字符串。
例如
const myNum = 0.000355;
const oneSigFig = myNum.toPrecision(1);
console.log(oneSigFig) // output: 0.0004
答案 3 :(得分:1)
您可以将toFixed
用于较大的数字,将toPrecision
或toExponential
用于较小的数字。您还提到了空间量也是一个问题,因此将用于最小数字的指数表示法似乎是个好主意。
function toFixedOrPrecision(num) {
if (num > 0.01) return num.toFixed(2);
return num.toPrecision(1);
}
function toFixedOrExponential(num) {
if (num > 0.01) return num.toFixed(2);
return num.toExponential(0);
}
for (let n=123456789; n>1e-10; n/=10) console.log(toFixedOrPrecision(n));
for (let n=123456789; n>1e-10; n/=10) console.log(toFixedOrExponential(n));