繁体   English   中英

JavaScript:四舍五入到小数位,但去掉多余的零

[英]JavaScript: Round to a number of decimal places, but strip extra zeros

这是场景:当我应该得到1.0时,我得到了.9999999999999999
我可以承受丢失小数点的精度,所以我使用.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()获得的字符串中的尾随零。 这是一个纯字符串操作:

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

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

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

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

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

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

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

嗯,跨浏览器的答案也有所不同:

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

根据问题标题,这些都没有真正让我得到我正在寻找的东西,例如,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时才有效

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

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

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

有一种更好的方法可以保持精度并去除零。 这需要一个输入数字,并通过一些强制转换的魔法将拉出任何尾随零。 我发现 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));

toFixed()方法使用定点表示法格式化一个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

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

您可以使用toFixed()方法使用定点表示法格式化数字。 请记住,参数可能是 0 到 20 之间的值。这会将您的四舍五入数字作为字符串返回,但它仍将包含尾随零。 然后,您可以使用parseFloat来获取不带尾随零的四舍五入数字。 例子:

 function prettyRound(num, decimals) { return parseFloat(num.toFixed(decimals)); } const numberToRound = 1.12006 console.log(prettyRound(numberToRound, 3)) const anotherToRound = 1.10006 console.log(prettyRound(anotherToRound, 4))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM