代码之家  ›  专栏  ›  技术社区  ›  Derek Adair

如何在javascript中舍入数字?.tofixed()返回字符串?

  •  129
  • Derek Adair  · 技术社区  · 15 年前

    我是不是错过了什么?

    var someNumber = 123.456;
    someNumber = someNumber.toFixed(2);
    alert(typeof(someNumber));
    //alerts string
    

    为什么? .toFixed() 返回字符串?

    我想把这个数字四舍五入到2位小数。

    11 回复  |  直到 6 年前
        1
  •  103
  •   C. K. Young    15 年前

    它返回一个字符串,因为0.1及其幂(用于显示小数部分)在二进制浮点系统中不可表示(至少不具有完全精度)。

    例如,0.1实际上是0.10000000000000055511151231257827021181583404541015625,0.01实际上是0.010000000000020816681711721685132943093776702880859375。(感谢 BigDecimal 为了证明我的观点。:-p)

    因此(缺少十进制浮点或有理数类型),将其输出为字符串是将其精确剪裁为显示所需精度的唯一方法。

        2
  •  114
  •   m93a    6 年前

    Number.prototype.toFixed 是设计用于 格式 一个数字 在打印出来之前。它是来自 toString , toExponential toPrecision .

    要舍入一个数字,您需要执行以下操作:

    someNumber = 42.008;
    someNumber = Math.round( someNumber * 1e2 ) / 1e2;
    someNumber === 42.01;
    
    // if you need 3 digits, replace 1e2 with 1e3 etc.
    

    .

    或者如果你想要 本土化的 函数,您可以扩展原型:

    Number.prototype.toFixedNumber = function(x, base){
      var pow = Math.pow(base||10,x);
      return Math.round(this*pow) / pow;
    }
    
    someNumber = 42.008;
    someNumber = someNumber.toFixedNumber(2);
    someNumber === 42.01;
    
    
    //or even hexadecimal
    
    someNumber = 0xAF309/256  //which is af3.09
    someNumber = someNumber.toFixedNumber(1, 16);
    someNumber.toString(16) === "af3.1";
    

    但是,请记住,在编写模块时,污染原型被认为是不好的,因为模块不应该有任何副作用。

    .

    虽然我不太喜欢JSPerf,但这里有一个链接与使用转换(在其他答案中)的方法的比较,这个链接:
    https://jsperf.com/rounding-a-number-2

        3
  •  104
  •   m93a    6 年前

    我通过改变这一点来解决这个问题:

    someNumber = someNumber.toFixed(2)
    

    ……

    someNumber = +someNumber.toFixed(2);
    

    但是,这会将数字转换为字符串并再次对其进行分析,这将对性能产生重大影响。如果您关心性能或类型安全,请检查其他答案。

        4
  •  21
  •   Ronan Boiteau    6 年前

    为什么不使用 parseFloat ?

    var someNumber = 123.456;
    someNumber = parseFloat(someNumber.toFixed(2));
    alert(typeof(someNumber));
    //alerts number
    
        5
  •  13
  •   Joel Coehoorn    15 年前

    当然,它返回一个字符串。如果您想对数值变量进行四舍五入,可以改用math.round()。to fixed的点是用固定的小数位数格式化数字。 供用户显示 .

        6
  •  11
  •   ProgramFOX    10 年前

    我用javascript把它转换回数字来解决这个问题。 Number() 功能

    var x = 2.2873424;
    x = Number(x.toFixed(2));
    
        7
  •  3
  •   Tomas Vana    15 年前

    当它应该格式化一个数字时,您希望它返回什么?如果你有一个数字,你就不能对它做任何事情,因为例如 2 == 2.0 == 2.00 所以它必须是一个字符串。

        8
  •  3
  •   meisam    7 年前

    您可以简单地使用“+”将结果转换为数字。

    var x = 22.032423;
    x = +x.toFixed(2); // x = 22.03
    
        9
  •  1
  •   Christoph    15 年前

    因为它的主要用途是显示数字?如果要对数字进行四舍五入,请使用 Math.round() 有适当的因素。

        10
  •  1
  •   Sartaj    6 年前

    下面是一个稍微更实用的答案版本 m93a 提供。

    const toFixedNumber = (toFixTo = 2, base = 10) => num => {
      const pow = Math.pow(base, toFixTo)
      return +(Math.round(num * pow) / pow)
    }
    
    const oneNumber = 10.12323223
    
    const result1 = toFixedNumber(2)(oneNumber) // 10.12
    const result2 = toFixedNumber(3)(oneNumber) // 10.123
    
    // or using pipeline-operator
    const result3 = oneNumber |> toFixedNumber(2) // 10.12
    
        11
  •  0
  •   Pyro    6 年前

    要提供一个为什么必须是字符串的示例:

    如果将1.tofixed(2)格式化,将得到“1.00”。

    这与1不同,因为1没有2个小数。


    我知道javascript不完全是一个 性能 语言,但是如果你使用如下的方法,你很可能会在四舍五入中获得更好的表现: RoundedValue=数学四舍五入(值*100)*0.01