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

时间:2011-09-05 20:26:08

标签: javascript math floating-point rounding

以下是这样的情景:当我得到.9999999999999999时,我收到1.0
我可以承受丢失小数位的精度,所以我使用.toFixed(15),这是有用的。

四舍五入有效,但问题是我得到了1.000000000000000 有没有办法可以舍入到多个小数位,但是删除了额外的空格?

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

10 个答案:

答案 0 :(得分:129)

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

答案 1 :(得分:32)

是的,有办法。使用parseFloat()

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1

在此处查看实时示例:http://jsfiddle.net/nayish/7JBJw/

答案 2 :(得分:18)

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

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

答案 3 :(得分:9)

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

答案 4 :(得分:6)

如果将返回值强制转换为数字,那么将删除那些尾随零。这也比parseFloat()更简洁。

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

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

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

  

转换整数和浮点数的字符串表示形式   作为非字符串值true,false和null。两者中的整数   支持十进制和十六进制(" 0x" -prefixed)格式。   支持负数(但不支持十六进制)。如果不能   解析一个特定的值,它将评估为NaN。

答案 5 :(得分:4)

对于跨浏览器来说,嗯,这个答案有点不同:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

答案 6 :(得分: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

注意:正则表达式仅在places > 0

时有效

P.S。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

答案 7 :(得分: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));

答案 8 :(得分:0)

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

它采用了上舍入策略。

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

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

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

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

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

有关将字符串转换为数字的不同方法的概述,请查看this问题,该问题提供了很好的答案。

答案 9 :(得分:0)

我发现最有效的下注方法如下

function round(value, decimals) {
  return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}