自动将小数点后的零位数可变的浮点数舍入到第一个非零数字

时间:2018-07-08 14:41:47

标签: javascript jquery

我正在处理浮点数,需要在宽度有限的网页小部件上显示它们。我大部分的浮点数都使用tofixed(2)。但是在某些情况下,存在诸如0.0000000365468之类的数字,因为tofixed(2)仅打印0.00。我不能将其永久设置为tofixed(8),因为在正常情况下会占用太多空间。

javascript / jquery中是否有任何内置功能,我可以自动将数字四舍五入到最接近的有意义数字(在上述情况下,0.000000030.00000004准确地说)?

4 个答案:

答案 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用于较大的数字,将toPrecisiontoExponential用于较小的数字。您还提到了空间量也是一个问题,因此将用于最小数字的指数表示法似乎是个好主意。

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));