我为客户提供了一些科学家,他们对如何在JavaScript中四舍五入有一些问题。他们希望将所有内容四舍五入到最多3个无花果,这在大多数情况下都是有效的,但让我举一些他们想要的例子:
实验室值转换为四舍五入值
123.5至124
1234至1230
12.0至12.0
0.003至0.003
因此换句话说,将超过3个信号图的数字四舍五入到3。如果某个东西有1个或2个信号图,请不要添加零(因为这意味着实验室比实际要精确得多),但是在这种情况下12.0的DONT删除了零(因为这意味着实验室的准确性不如实际)
答案 0 :(得分:1)
对于toPrecision
至12.0
示例,使用12.0
可用于所有示例:
var nums = [123.5, 1234, 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 if it ends with .0 or .00, etc.
// use alternative string method:
var zeros = str.match(/[0]+$/)[0].length; // count the no. of trailing zeros
var sigfigs = parseFloat(str).toString().length; // no. of other sig figs
var zerosNeeded = 3 - sigfigs;
if (zerosNeeded < 0) {
return parseFloat(parseFloat(str).toPrecision(3)).toFixed();
} else {
return str.substring(0, sigfigs + 1 + zerosNeeded); // +1 for the decimal point
}
} else {console.log(str)
return parseFloat(parseFloat(str).toPrecision(3)).toString()
}
});
// => ["124", "1230", "12.0", "0.003", "1.00", "1240"]
这可行,但是如果您需要使用浮点数和类似的值,结果必须为字符串格式,我建议您使用其他语言,例如Python。无论如何,我希望这会有所帮助!
答案 1 :(得分:0)
您需要做的就是编写一个自定义解析器。
请参见以下示例:
const data = [123.5, 1234, 12.0, 0.003, 100.0, 1.0];
data.forEach(n => {
const result = customToPrecision(n, 3);
console.log(`${n} -> ${result}`);
});
function customToPrecision(number, precision){
let result = number.toPrecision(precision);
// Check if original number is a float
if (number % 1 !== 0){
result = result
.replace(/0+$/, '') // Remove trailing zeros
.replace(/\.$/, '.0'); // Add one zero to incomplete decimal
}
return result;
}