从数字中删除不重要的尾随零?

266

我是否错过了一个标准的API调用,可以将数字末尾无关的零去掉?

var x = 1.234000; // to become 1.234
var y = 1.234001; // stays 1.234001

Number.toFixed()Number.toPrecision()并不完全符合我的需求。


6
嗯,1.234000 === 1.234的意思是“1.234000等于1.234”。 - Gumbo
5
如果您执行alert(x),它会弹出没有尾随零的值。 - JKirchartz
78
经过与多个客户的合作,我可以证明即使 1.234000 === 1.234,如果没有必要,客户也不想看到那些多余的零。 - contactmatt
32
使用 parseFloat(n) ? - Mr. Alien
我的问题是:前导零无关紧要吗?从数学角度来看,1.2300表示:小数点后面的4位数字是精确的。而1.23表示:只有2位数字是精确的,可能会四舍五入。例如:比较12m和12.00m。 - Wiimm
显示剩余2条评论
24个回答

0
我的解决方案如下:
export const floatToStr = (f, ndigit = 2) => {
    const str = f.toFixed(ndigit)
    return ndigit
        ? str
            .replace(/0*$/g, '')
            .replace(/\.$/, '')
        : str
}

0

阅读了所有的答案和评论后,我最终得出了这个结论:

function isFloat(n) {
    let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n)) : n;
    return number;
}

我知道使用eval可能会有些危险,但这对我很有帮助。

所以:

isFloat(1.234000);     // = 1.234;
isFloat(1.234001);     // = 1.234001
isFloat(1.2340010000); // = 1.234001

如果你想限制小数位数,可以使用toFixed(),正如其他人所指出的那样。

let number = (Number(n) === n && n % 1 !== 0) ? eval(parseFloat(n).toFixed(3)) : n;

就是这样。


0
简单易读,也可以处理长数字, 基于megasnort的解决方案。
function removeTrailingZeros(num: number) : number {
  let value = num.toString();

  const indexOfDot = value.indexOf('.');
  if (indexOfDot === -1) {
      return num;
  }

  let i = value.length - 1;
  while ((value[i] === "0" || value[i] === ".") && i > indexOfDot - 1) {
    value = value.substring(0, i);
    i--;
  }
  return +value;
} 

-1
这是一个可能的解决方案:
var x = 1.234000 // to become 1.234;
var y = 1.234001; // stays 1.234001

eval(x) --> 1.234
eval(y) --> 1.234001

4
这个简单的任务不需要使用 eval!parseFloat()更加适合。 - hutchbat
9
eval == evil. 不要使用它。意思是“eval”等同于“evil”,永远不要使用这个。 - eagor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接