如何围绕一个浮点数,使小数点后只有两个尾随数字?

时间:2014-12-01 02:38:07

标签: javascript floating-point rounding significant-digits

我有一个像137.57667565656这样的浮点数,但是我想将它舍入为小数点后面只有两个尾随数字,就像新的浮点数一样是137.58。

到目前为止我试过这个:

(Math.round((value*100)/100)).toFixed(2).toString();

但不幸的是,它将我的价值调整为137.00。它将小数位添加为零,为什么?

我如何实现上述目标?

4 个答案:

答案 0 :(得分:6)

你期待什么?

(value*100)/100

只返回 value 的原始值,所以

Math.round((value*100)/100))

与:

相同
Math.round(value)

然后你有:

Math.round(value).toFixed(2).toString();

所以 value 舍入为整数, toFixed 将添加两个小数位并返回一个字符串,因此 toString 部分是多余的。如果您希望将舍入到四位小数,那么:

value.toFixed(4)

将完成这项工作:

var x = 137.57667565656;

console.log(x.toFixed(4)); // 137.5767

如果你想把它四舍五入到2个位置但是把它呈现为4,那么:

Number(x.toFixed(2)).toFixed(4)  // 137.5800

答案 1 :(得分:1)

我有一个更简单的答案,适用于所有重要人物,而不仅仅是四个。 JavaScript提供了built-in Number.toPrecision()函数,该函数返回表示有效数字的数字的字符串。

var value = 137.57667565656;
var strVal = value.toPrecision(4);
>> 137.6

对这篇文章中的重要数据存在很多误解。请参阅Wikipedia以更新您的记忆。请参阅@ RobG的答案,了解原始方法不正确的原因。

答案 2 :(得分:0)

添加了两个零,因为在您执行Math.round之前:

  

如果数字的小数部分是.5或更大,则参数为   四舍五入到下一个更高的整数。如果是小数部分   number小于.5,参数四舍五入到下一个   整数。

(taken from here)

您需要放弃Math.round

(value*100)/100).toFixed(4).toString();

在JSFiddle上看到它:http://jsfiddle.net/0fe5mm95/

答案 3 :(得分:0)

编辑显然我误解了这个问题。当我试图回答时(至少在标题中)有关有效数字。

此答案与Wikipedia's definition of significant digits对齐。它通过三个步骤解决了一般问题,包括任意数量的有效数字:

  1. 计算log10的位数(如果-1<x<1则为负数,例如12345为5,或0.01为-2)
  2. 将数字四舍五入到正确的位置(例如,如果x = 12345,带有三位有效数字,则将45转为00)
  3. 在右侧附加所需数量的零
  4. 这就是全部。零除外,没有有效数字。 (我去了#34; 0.00&#34;当要求三位有效数字时,但0或0.0也没问题)

    function toStringWithSignificantDigits( x, len ){
        if(x==0) return x.toFixed(len-1); // makes little sense for 0
        var numDigits = Math.ceil(Math.log10(Math.abs(x)));
        var rounded = Math.round(x*Math.pow(10,len-numDigits))*Math.pow(10,numDigits-len); 
        return rounded.toFixed(Math.max(len-numDigits,0));  
    }
    
    
    function testIt(x,len){
        console.log( "format " + x + " to " + len + " significant digits: " + toStringWithSignificantDigits(x,len)); 
    }
    
    testIt(12.345,6);  // 12.3450
    testIt(12.345,5);  // 12.345
    testIt(12.345,4);  // 12.35
    testIt(12.345,3);  // 12.3
    testIt(12.345,2);  // 12
    testIt(12.345,1);  // 10
    
    testIt(0.012345,7);  // 0.01234500
    testIt(0.012345,6);  // 0.0123450
    testIt(0.012345,5);  // 0.012345
    testIt(0.012345,4);  // 0.01235
    testIt(0.012345,3);  // 0.0123
    testIt(0.012345,2);  // 0.012
    testIt(0.012345,1);  // 0.01
    
    testIt(0,3); // 0.00, zero is a special case, as it has no significant digit