【问题标题】:How can I round a float such that there are only two trailing digits after the decimal point?如何舍入浮点数以使小数点后只有两位尾随数字?
【发布时间】:2023-03-05 09:02:02
【问题描述】:

我有一个浮点数,例如 137.57667565656,但我想对其进行四舍五入,以便小数点后只有两位尾随数字,例如新的浮点数将为 137.58。

到目前为止我已经试过了:

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

但不幸的是,它将我的值四舍五入为 137.00。它将小数位添加为零,为什么?

我怎样才能实现上述目标?

【问题讨论】:

  • 137.57667565656 不是减少到 4 个有效数字 137.6 吗?
  • @RobG,对不起,我希望它像 137.58 一样,其中最后一位数字是四舍五入的,它是小数点后的两位尾随数字。

标签: javascript floating-point rounding significant-digits


【解决方案1】:

你期待什么?

(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

【讨论】:

  • 四位固定小数与四位有效数字不同。
  • @Merchako——是的,因此我对 OP 发表了评论。我不清楚 OP 想要什么。 ;-)
  • 我刚刚提出了一个编辑建议,这样我们实际上可以从中得到一个有用的问题,而不是等待 OPer 从不回复。
  • @Merchako,我很抱歉哈哈。很久以前了,但我想要的是像我在帖子 137.57 中提到的那样,小数点后有两位尾随数字,所以你的编辑是不正确的 Merchako。 RobG 是对的......我想我只是使用了 Math.Round 并且解决了这个问题。
【解决方案2】:

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

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

对于这篇文章中的重要数字存在很多误解。请参阅Wikipedia 刷新您的记忆。请参阅@RobG 的回答,了解您原来的方法不正确的原因。

【讨论】:

    【解决方案3】:

    添加两个零是因为在您所做的一切之前Math.round

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

    (taken from here)

    你需要的是删除Math.round:

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

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

    【讨论】:

    • ((value*100)/100)的重点是(假设语法错误已修复)? ;-)
    • @RobG 它在问题中。我假设 Kala J 使用其他值。问题不在于划分,而在于使用Math.round
    【解决方案4】:

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

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

    1. 用 log10 计算位数(如果 -1<x<1 为负数,例如 5 表示 12345,或 -2 表示 0.01)
    2. 将数字四舍五入到正确的位置(例如,如果 x=12345 具有三位有效数字,则将 45 舍入为 00)
    3. 在右侧附加所需数量的零

    仅此而已。除了零,它没有有效数字。 (当要求三个有效数字时,我选择了“0.00”,但 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多