如何在不使用科学计数法的情况下显示“toPrecision”的结果?

39

根据http://www.mredkj.com/javascript/nfbasic2.html,以下代码将导致5.6e+2

num = 555.55;
result = num.toPrecision(2); // result will equal 5.6e+2

如何让结果变量的输出不以科学计数法(即以e表示)的形式呈现?

6个回答

28

要获得精度降低的浮点数,您可以像您所做的那样使用toPrecision(),然后使用parseFloat()解析科学计数法,如下所示:

result = parseFloat(num.toPrecision(2));

如果您不希望减少精度,可以使用 toFixed() 来获取带有一定小数位数的数字。

3
这将得到2个小数位。精度计算不是从小数点开始,而是从第一位数字开始。对于“555.55”的toPrecision(2)意味着类似于toFixed(-1)(由于实际上没有意义所以不存在)。 - David Hedlund
这太棒了。它可以很好地格式化大数值(24823492.293849 --> 25000000),也可以处理带有小数位的数字(例如:1/5 + 1/20 - 1/200 + 1/400 + 1/10 = 0.34750000000000003 --> 0.35)。 - prototype
1
toPrecision() 的一个好处是它保留了尾随零,表明结果的精度(例如 (0.5).toPrecision(2) 会得到 "0.50")。如果你想保持这种行为,你可以使用 result = num.toPrecision(2).includes('e') ? parseFloat(num.toPrecision(2)) : num.toPrecision(2) - ChrisV
1
如果你想同时移除像3.1e-31这样非常小的数字:parseFloat((Math.round(value * 100000) /100000).toPrecision(2)) - stallingOne

21

1
+1,删除了我自己的答案。这是完全正确的做法。 - David Hedlund
这比使用 parseFloat((555.55).toPrecision(2)) 更可取。 - asmmahmud
@asmmahmud:为什么它比parseFloat更可取? - Mitar

1

我有类似的愿望,希望保留一定的精度,不要有尾随零,并且不使用科学计数法。我认为以下函数可以实现:

function toDecimalPrecision(val, digits) {
  val = (+val).toPrecision(digits);
  if (val.indexOf('e') >= 0) {
    val = (+val).toString();
  } else if (val.indexOf('.') >= 0) {
    val = val.replace(/(\.|)0+$/, '');
  }
  return val;
}

0

尝试一下

result = Math.ceil(555.55);

5
这将得出 556,而不是 5.6e+2 所代表的 560 - David Hedlund

0

这对我有用 [TypeScript]:

const toDecimalPrecision = (value: number, digits: number) => {
  let fixed = 2
  const result = parseFloat(value.toPrecision(digits))
  while (parseFloat(result.toFixed(fixed)) !== result && fixed < 20) {
    fixed++
  }
  return result.toFixed(fixed)
}

-3

eval 是危险的。

应该使用以下方法:

var result = num.toPrecision(2).toString(10);

代替。


1
toPrecision返回一个字符串,因此在其上调用toString不会有任何区别。 - Sebastian Paaske Tørholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接