从数字中删除无关紧要的尾随零?

IT技术 javascript regex math numbers
2021-01-25 06:07:21

我是否错过了从数字中删除尾随无关紧要的零的标准 API 调用?

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

Number.toFixed()并且Number.toPrecision()不是我正在寻找的。

6个回答

我有一个类似的例子,我想.toFixed()在必要的地方使用,但我不想要填充。所以我最终将 parseFloat 与 toFixed 结合使用。

toFixed 无填充

parseFloat(n.toFixed(4));

另一个几乎做同样事情的选项
这个答案可能会帮助你做出决定

Number(n.toFixed(4));

toFixed将数字舍入/填充到特定长度,但也将其转换为字符串。将其转换回数字类型不仅会使数字在算术上使用更安全,而且还会自动删除任何尾随 0。例如:

var n = "1.234000";
    n = parseFloat(n);
 // n is 1.234 and in number form

因为即使您定义了一个带有尾随零的数字,它们也会被删除。

var n = 1.23000;
 // n == 1.23;
@Gary,我撤回我的评论,我看到的parseFloat(n).toFixed(4);不是你的实际答案。抱歉。
2021-03-20 06:07:21
@LeopoldoSanczyk 不,仅当您仅使用 toFixed 时才如此,因为它返回一个字符串。数字类型会自动丢失尾随零。这就是我同时使用两者的原因。
2021-03-21 06:07:21
为什么不+(n.toFixed(4))呢?
2021-04-02 06:07:21
请注意,这仅在相关小数位数等于或大于 toFixed 参数时才有效。例如,如果数字是 1.200000,则 toFixed(3) 的结果将是 1.200,因此不会删除所有尾随零。
2021-04-06 06:07:21
赞成!你的答案只有一个问题 0.00000005 被转换为 5e-8 如何在没有这个问题的情况下删除无关紧要的零,我正在处理小数字,例如 0.000058000,其中最后的零需要删除
2021-04-12 06:07:21

如果将其转换为字符串,它将不会显示任何尾随零,这些零一开始就没有存储在变量中,因为它是作为数字创建的,而不是字符串。

var n = 1.245000
var noZeroes = n.toString() // "1.245" 
当然,如果你的 var 已经是一个字符串,你必须先把它转换成一个数字,然后再转换回来
2021-03-14 06:07:21
可能会产生意想不到的结果,例如:123111111111111111111111111111112222222222222222222222222222222222222222222.00。字符串表示将采用指数格式:1.231111111111111e+81
2021-03-19 06:07:21
我正要发布一些代码来去除零,但丹尼尔的解决方案似乎有效。它甚至适用于诸如“1.2345000”之类的字符串。("1.2345000" * 1).toString(); // 变成 1.2345
2021-04-02 06:07:21
这不是完整的解决方案。当您有一些浮点表示错误的变量时,它不起作用,例如:(var n = 1.245000000000001假设向用户表示无意义)
2021-04-12 06:07:21
如何将 0.0000000800 转换为 0.00000008 ?parseFloat、Number 和 toString 函数返回科学记数法 8e-8,这不是我想要的。
2021-04-12 06:07:21

我首先结合使用了 matti-lyra 和 gary 的答案:

r=(+n).toFixed(4).replace(/\.0+$/,'')

结果:

  • 1234870.98762341:“1234870.9876”
  • 1230009100:“1230009100”
  • 0.0012234:“0.0012”
  • 0.1200234:“0.12”
  • 0.000001231:“0”
  • 0.10001:“0.1000”
  • "asdf": "NaN"(所以没有运行时错误)

有点问题的情况是 0.10001。我最终使用了这个更长的版本:

    r = (+n).toFixed(4);
    if (r.match(/\./)) {
      r = r.replace(/\.?0+$/, '');
    }
  • 1234870.98762341:“1234870.9876”
  • 1230009100:“1230009100”
  • 0.0012234:“0.0012”
  • 0.1200234:“0.12”
  • 0.000001231:“0”
  • 0.10001:“0.1”
  • "asdf": "NaN"(所以没有运行时错误)

更新:这是加里的新版本(见评论):

r=(+n).toFixed(4).replace(/([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)/,'$1')

这给出了与上面相同的结果。

嘎!显然,与其他人相比,我不太擅长打破自己的 RegEx。我不会让这打败我的!我针对您的所有测试用例以及我能想到的任何(有效)测试用例运行了这个([0-9]+(\.[0-9]+[1-9])?)(\.?0+$)
2021-03-22 06:07:21
@w00t Gary 的正则表达式对于 1230009100 失败,使用replace(/\.0*$|(\.\d*[1-9])0+$/, '$1')或来自 João Costa的正则表达式请参阅regex101.com/r/KmsEFd/1
2021-03-22 06:07:21
正则表达式是贪婪的,有时会从整数部分中删除“0”!:-( 为什么不只是replace(/[,.][1-9]+(0+)/,'')
2021-03-30 06:07:21
我有一个我认为有效的纯正则表达式解决方案 toFixed(4).replace(/([0-9]+(\.[1-9]+)?)(\.?0+$)/,"$1")
2021-04-08 06:07:21
被低估的回答这个。
2021-04-11 06:07:21

toFixed如有必要,方法将进行适当的舍入。它还会添加尾随零,这并不总是理想的。

(4.55555).toFixed(2);
//-> "4.56"

(4).toFixed(2);
//-> "4.00"

如果将返回值转换为数字,则将删除那些尾随零。这是一种比自己进行四舍五入或截断数学运算更简单的方法。

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4
棘手,但正是我一直在寻找的:删除重要的尾随零(当然我们通过toFixed调用使之变得重要)。这是一个奇怪的用户体验边缘案例。
2021-03-22 06:07:21

像这样乘以一怎么样?

var x = 1.234000*1; // becomes 1.234

var y = 1.234001*1; // stays as 1.234001