JavaScript:舍入到小数点后一位,但去除多余的零


85

这是场景:我正在 .9999999999999999应该得到的时间1.0
我有能力舍弃精度的小数位,因此我正在使用.toFixed(15),这种工作方式。

取整有效,但问题是我得到了 1.000000000000000
有没有一种方法可以舍入到小数位数,但是要去除多余的空格?

注意:.toPrecision这不是我想要的;我只想指定小数点后有多少个数字。
注意2:我不能只使用它,.toPrecision(1)因为我需要为小数点后实际有数据的数字保持高精度。理想情况下,小数位数应尽可能多(最多15个)。


关键是.toFixed返回一个字符串,因此只需通过数字将其往返然后返回到字符串即可将其转换为无尾随零。
尼尔

@内森:只是为了澄清。您是否只想删除通过toFixed()获得的字符串中的尾随零?
吉里·

Answers:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
处理负数时,请不要忘记将它们放在括号中:由于运算符的优先级-2.34.toFixed(1)返回。-2.3
38КонстантинВан

1
使用一元+运算符应该比该parseFloat函数更快:+number.toFixed(13)此表达式还可以用于删除JavaScript数字错误,例如1.0000000000000045。
ygoe


19

据我了解,您想删除通过获取的字符串中的尾随零toFixed()。这是一个纯字符串操作:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

6
您是唯一真正回答这个问题的人。谢谢!
Mugen

4
这将点
保留

5
@pckill如果不想将点替换为正则表达式(...replace(/\.?0+$/, "");)。
Zach Snow

该操作在0和-0上失败,因为0变成了空字符串"",并且-0变成了-,两者都不是预期的(猜测)。@ zach-snow,建议的解决方案也会在0和-0上失败。
robocat

@ Mugen,Gus的答案出了什么问题?
trysis

9

Number(n.toFixed(15)) or +(n.toFixed(15)) 会将15位十进制字符串转换为数字,并删除尾随的零。


1
以为我会指出,+(n.toFixed(...))比parseFloat效率更高。不知道为什么,但是它比Chrome中的Number更有效。
Domino

8

如果将返回值强制转换为数字,则那些尾随的零将被删除。这也没有那么冗长parseFloat()

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

+(4).toFixed(2);
//-> 4

这使用了一元+运算符,因此,如果将此用作字符串操作的一部分,则需要在其之前加上一个infix + :var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));。仅供参考,字符串前面的一元+会将其转换为数字。来自MDN:一元+可:

转换整数和浮点数以及非字符串值true,false和null的字符串表示形式。支持十进制和十六进制(“ 0x”前缀)格式的整数。支持负数(尽管不支持十六进制)。如果它无法解析特定值,则它将评估为NaN。


@robocat我刚刚做了一个简单的检查;+(4.1).toFixed(4)4.1铬60
КонстантинВан

我不明白 为什么这个答案被否决是什么原因?
КонстантинВан

@K您说得对,所以我删除了之前的评论并添加到答案中(我认为我使用的是在lhs上使用字符串的infix +,而不是正确地使用一元+。通常我会更加小心!干杯)
robocat

此答案仍适用于NaN,Infinity,-Infinity,3e30和0。在某些极端情况下,其他一些答案也会失败。
robocat

(4).toFixed(2)->“ 4.00” in Chrome 60.0.3112.113
Daniel Que

1

这些都没有真正让我根据问题标题找到我想要的东西,例如,将5.00设为5,将5.10设为5.1。我的解决方案如下:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

注意:regex仅在以下情况下有效 places > 0

PS https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed


失败5e30(将编号更改为5e3)。拐角处的情况是恶魔般的!
robocat

0

有一种更好的方法可以保持精度,也可以去除零。这需要一个输入数字,并且通过某种强制转换的方法将拉出任何结尾的零。我发现16是我的精度极限,如果您不把卫星放在冥王星上,那将是非常不错的。

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));

0

toFixed()方法number使用定点表示格式化a ,并返回string

它采用了上半舍入策略。

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

正如您所描述的,确实有时也会导致(可能不必要)尾随零。

(0.001).toFixed(2); // returns 0.00

您可能不希望摆脱那些尾随的零,基本上可以将其转换回a number。有很多方法可以做到这一点。

+(0.001).toFixed(2); // the shortest

有关将字符串转换为数字的不同方法的概述,请检查问题,问题具有出色的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.