JavaScript:舍入到多个小数位,但删除额外的零

Nat*_*han 78 javascript math floating-point rounding

这是一个场景:我.9999999999999999什么时候到达1.0.
我可以承受丢失小数位的精度,所以我正在使用.toFixed(15),哪种工作.

四舍五入有效,但问题是我得到了1.000000000000000.
有没有办法舍入到一些小数位,但剥去额外的空格?

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

Gus*_*Gus 133

>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
Run Code Online (Sandbox Code Playgroud)

  • 使用一元 + 运算符应该比 `parseFloat` 函数更快:`+number.toFixed(13)` 这个表达式也可以用来消除 JavaScript 数字不准确的地方,比如 1.0000000000000045。 (5认同)
  • 在处理负数时,不要忘记将它们放在括号中:`-2.34.toFixed(1)`由于_operator precedence_而返回`-2.3`. (4认同)

Nay*_*ish 33

是的,有一种方法.使用parseFloat().

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1
Run Code Online (Sandbox Code Playgroud)

在这里查看一个实例:http://jsfiddle.net/nayish/7JBJw/

  • 不适用于 `parseFloat("0.0000007")`,它给出 `"7e-7"` (5认同)

Jir*_*riz 18

据我所知,您想要删除通过您获得的字符串中的尾随零toFixed().这是一个纯字符串操作:

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

  • 你是唯一真正回答过这个问题的人..谢谢! (6认同)
  • @pckill如果你不想要点你可以将它包含在要替换的正则表达式中(`... replace(/ \.?0 + $ /,"");`). (5认同)
  • 这会在圆形数字上留下点("100.00"=>"100") (4认同)

ken*_*bec 9

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


小智 7

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

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

+(4).toFixed(2);
//-> 4
Run Code Online (Sandbox Code Playgroud)

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

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