以下是这样的情景:当我得到.9999999999999999
时,我收到1.0
。
我可以承受丢失小数位的精度,所以我使用.toFixed(15)
,这是有用的。
四舍五入有效,但问题是我得到了1.000000000000000
有没有办法可以舍入到多个小数位,但是删除了额外的空格?
注意:.toPrecision
不是我想要的;我只想指定小数点后面的数字。
注2:我不能只使用.toPrecision(1)
,因为我需要保持小数点后实际有数据的数字的高精度。理想情况下,必要时会有尽可能多的小数位(最多15个)。
答案 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);
}