经过长时间的搜索,我问这个问题。
我的任务是将号码总数限制为 8 个。 toPrecision 正在按预期工作,除了这一点:
一些测试用例:
似乎 toPrecision 没有按其预期工作,即返回我们想要的确切数字。它将小数点前的零和小数点后的尾随零相加为总位数。
我的意图:
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))
希望有帮助!
自从他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"
对我来说,这个解决方案按预期工作且干净。
干杯!
您可以使用
toPrecision()
功能。
例如:
console.log(Number(1).toPrecision(8));
这会给你
"1.0000000"