JavaScript:舍入到小数位数,但是去掉额外的零

这里的情况是:我得到.9999999999999999当我应该得到1.0
我可以承受失去精度的小数位,所以我使用.toFixed(15) ,这是一种工作。

四舍五入的工作,但问题是,我给了1.000000000000000
有没有一种方法来四舍五入到小数位数,但剥去额外的空格?

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

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

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

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

在这里看到一个生动的例子: http : //jsfiddle.net/nayish/7JBJw/

据我所知,你想删除通过toFixed()获得的string中的尾随零。 这是一个纯粹的string操作:

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

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

嗯,有点不同的答案,对于跨浏览器:

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

如果您将返回值转换为数字,那些尾随的零将被删除。 这也不比parseFloat()更详细。

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

这使用一元+运算符 ,所以如果使用这个作为string操作的一部分,你需要在它之前有一个中缀+: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2)); var n=0.9999999999999999; console.log('output ' + +n.toFixed(2)); 。 仅供参考一个string前面的一个+将其转换为一个数字。 从MDN:一元+可以:

转换整数和浮点数的string表示forms,以及非string值true,false和null。 支持十进制和hex(“0x”前缀)格式的整数。 负数是支持的(虽然不是hex)。 如果它不能parsing一个特定的值,它将评估为NaN。

根据问题标题,这些都不是我所要找的,例如,5.00为5,5.10为5.1。 我的解决scheme如下:

 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 

注意:正则expression式只适用于places > 0

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

有一个更好的方法,保持精度,也剥离零。 这需要一个input数字,并通过一些魔法铸造将拉掉任何尾随零。 我发现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));