toPrecision 正在将小数点后的尾随零添加到预期总数中

问题描述 投票:0回答:3

经过长时间的搜索,我问这个问题。

我的任务是将号码总数限制为 8 个。 toPrecision 正在按预期工作,除了这一点:

一些测试用例:

  1. 4828.39019785 -> 4828.3902(预期)
  2. 0.39019785 -> 0.39019785(虽然它返回总共9位数字,但还可以)
  3. 0.0039019785 -> 0.0039019785(无意,返回 11 位数字)

似乎 toPrecision 没有按其预期工作,即返回我们想要的确切数字。它将小数点前的零和小数点后的尾随零相加为总位数。

我的意图:

  1. 0.39019785 -> 0.3901978(正好 8 位数字,包括 0)
  2. 0.0039019785 -> 0.0039019(正好 8 位数字,包括 3 个零)
javascript decimal precision
3个回答
1
投票

toPrecision()
功能旨在限制有效位数,而不是总位数。

当有前导 0 时,它不会产生你想要的结果,所以我创建了一个函数来删除之后不需要的东西:

var num1 = 0.39019785;
var num2 = 0.0039019785;

const exactPrecision = (number, precision) => 
  number
    .toPrecision(precision)
    .replace(new RegExp("((\\d\\.*){"+precision+"}).*"), '$1');

console.log(exactPrecision(num1, 8))
console.log(exactPrecision(num2, 8))

希望有帮助!


0
投票

自从他OP问这个问题以来已经有一段时间了,但我也遇到了类似的问题,所以这是我对没有任何正则表达式魔法的干净解决方案的建议:

function fiveDigits(x) {
    return x<1?x.toFixed(4):x.toPrecision(5);
}

如果有前导零,它将使用

toFixed()
来限制小数点分隔符后的小数位数。如果数字较大,小数点分隔符前没有 0,则四舍五入到所需的有效位数。

极端情况:当然有一个警告:如果您有大量数字,在小数分隔符之前需要更多数字,那么该函数会生成一个指数表示法的数字字符串,这当然会占用更多字符。

function fiveDigits(x) {
  return x<1?x.toFixed(4):x.toPrecision(5);
}

console.log(fiveDigits(123.456));
// expected output: "123.46"

console.log(fiveDigits(0.004));
// expected output: "0.0040"

console.log(fiveDigits(1.23e5));
// expected output: "1.2300e+5"

对我来说,这个解决方案按预期工作且干净。

干杯!


-1
投票

您可以使用

toPrecision()
功能。 例如:

console.log(Number(1).toPrecision(8));

这会给你

"1.0000000"

© www.soinside.com 2019 - 2024. All rights reserved.