JavaScript中的有效数字

JavaScript中的有效数字,javascript,Javascript,我有一些科学家为客户服务,他们在JavaScript中toPrecision是如何取整的方面存在一些问题。他们希望所有东西都四舍五入到最多3个sig无花果,这在大多数情况下都有效,但让我举几个例子说明他们想要什么: 实验室值到四舍五入值 123.5至124 1234至1230 12.0至12.0 0.003至0.003 换言之,用超过3个sig的无花果,把东西围起来,直到3个。如果有1或2个sig图,则不加零(这意味着实验室比实际更准确),但在12.0的情况下,也不要去掉零(这意味着实验室比实际

我有一些科学家为客户服务,他们在JavaScript中toPrecision是如何取整的方面存在一些问题。他们希望所有东西都四舍五入到最多3个sig无花果,这在大多数情况下都有效,但让我举几个例子说明他们想要什么:

实验室值到四舍五入值

123.5至124

1234至1230

12.0至12.0

0.003至0.003


换言之,用超过3个sig的无花果,把东西围起来,直到3个。如果有1或2个sig图,则不加零(这意味着实验室比实际更准确),但在12.0的情况下,也不要去掉零(这意味着实验室比实际更不准确)

使用
toPrecision
适用于除
12.0
12.0
示例以外的所有示例:

var nums=[123.51234,12.0,0.003]
var out=nums.map(num=>parseFloat(num.toPrecision(3)))
// => [124, 1230, 12, 0.003]
它用3个以上的符号将数字四舍五入到3,但如果使用的数字最后带有
.0
.00
,则会失败。原因是JavaScript引擎将
1.00
等同于
1
12.0
等同于
12
,因此问题实际上不是
toPrecision
,而是JavaScript本身

要解决此问题,您可以将数字作为字符串输入,如果没有十进制零,则使用
toPrecision
,否则对字符串本身进行操作:

var nums=['123.5','1234','12.0','0.003','1.000','1236.00'];
var out=nums.map(str=>{
if(/\.0+$/.test(str)){//test是否以.0或.00结尾,以此类推。
//使用替代字符串方法:
var zeros=str.match(/[0]+$/)[0].length;//计算尾随零的数量
var sigifigs=parseFloat(str).toString().length;//其他sig图的数量
var zerosNeeded=3-sigfigs;
如果(零需要<0){
返回parseFloat(parseFloat(str).toPrecision(3)).toFixed();
}否则{
返回str.substring(0,sigifigs+1+zerosneed);//+1表示小数点
}
}else{console.log(str)
返回parseFloat(parseFloat(str).toPrecision(3)).toString()
}
});
// => ["124", "1230", "12.0", "0.003", "1.00", "1240"]

这是可行的,但是如果您需要处理浮点数和类似的数据,那么结果必须是字符串格式,我建议您使用不同的语言,例如Python。不管怎样,我希望这有帮助

您需要做的就是编写一个自定义解析器

请参见此示例:

const data=[123.51234,12.0,0.003,100.0,1.0];
data.forEach(n=>{
常数结果=自定义精度(n,3);
log(`${n}->${result}`);
});
功能customToPrecision(数字、精度){
让结果=数字。toPrecision(精度);
//检查原始数字是否为浮点数
如果(编号%1!==0){
结果=结果
.replace(/0+$/,“”)//删除尾随的零
.replace(/\.$/,'.0');//将一个零添加到不完整的小数中
}
返回结果;

}
因此,您希望将具有三个或更多有效数字的值舍入为三,忽略任何其他值。@JackBashford是的!将超过三个sig无花果的数字四舍五入到三,并且不要触摸三个或三个以下的数字(24.0是三个sig无花果,适用于那些像我一样,高中科学生疏的人)天哪,谢谢!!这太糟糕了,我必须做客户端而不是服务器端side@ikenread别担心!那太糟糕了。。。只要你不需要用它来做任何复杂的数学题,你就可以了。另外,如果这解决了你的问题,如果你能点击答案下的绿色勾号接受我的答案,我将不胜感激。谢谢:)