JavaScript中的重要数字

时间:2019-06-27 01:44:02

标签: javascript

我为客户提供了一些科学家,他们对如何在JavaScript中四舍五入有一些问题。他们希望将所有内容四舍五入到最多3个无花果,这在大多数情况下都是有效的,但让我举一些他们想要的例子:

实验室值转换为四舍五入值

123.5至124

1234至1230

12.0至12.0

0.003至0.003

因此换句话说,将超过3个信号图的数字四舍五入到3。如果某个东西有1个或2个信号图,请不要添加零(因为这意味着实验室比实际要精确得多),但是在这种情况下12.0的DONT删除了零(因为这意味着实验室的准确性不如实际)

2 个答案:

答案 0 :(得分:1)

对于toPrecision12.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;
}