【问题标题】:Limit the amount of number shown after a decimal place in javascript限制javascript中小数点后显示的数字数量
【发布时间】:2011-05-14 10:49:21
【问题描述】:

嘿,我有一些像这样的花车

4.3455
2.768
3.67

我想像这样显示它们

4.34
2.76
3.67

我不想将数字向上或向下舍入,只是将小数点后显示的数字数量限制为 2。

【问题讨论】:

标签: javascript floating-point decimal limit


【解决方案1】:

你正在寻找toFixed:

var x = 4.3455;
alert(x.toFixed(2)); // alerts 4.35 -- not what you wanted!

...但看起来你想要截断而不是四舍五入,所以:

var x = 4.3455;
x = Math.floor(x * 100) / 100;
alert(x.toFixed(2)); // alerts 4.34

【讨论】:

  • 你是对的,我使用的是 toFixed() 但我也使用了 parseInt ,它将我的浮点数转换为数字并且 toFixed() 总是返回 xx.00 !
  • 你说得对。当我读到它在我脑海中点击时,我也看到了,大约一天前:-)
  • @dotty:啊,是的,parseInt 会将数字转换为字符串,然后将该字符串转换回数字,而不考虑小数点后的任何内容。 :-) 但在这种情况下不需要它,您可以在数字上调用函数(它们会自动从原语转换为 Number 实例)。
  • @Andy E:但我找不到。我放弃了,如果它很难找到,我们需要一个副本! :-)(编辑:啊,你找到了。我猜它太新了,谷歌还没有将它编入索引。)
  • @TJC: 是的,实际上是 8 天前……这些天我完全失去了时间的概念!
【解决方案2】:

正如 T.J 回答的那样,toFixed 方法将在必要时进行适当的舍入。它还会添加尾随零,这并不总是理想的。

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

(4).toFixed(2);
//-> "4.00"

如果您将返回值转换为数字,则那些尾随零将被删除。这是一种比您自己进行舍入或截断数学更简单的方法。

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

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

【讨论】:

  • 感谢您选择数字创意!
  • 选角的想法很棒?
  • 甜蜜的答案——简单、有效且不是特别明显。谢谢!
【解决方案3】:

如果您不想四舍五入到小数点后 2 位,请使用 toFixed() 舍入到 n 个小数位,然后将除 2 位之外的所有这些都去掉:

var num = 4.3455.toFixed(20);
alert(num.slice(0, -18));
//-> 4.34

请注意,当传递给toFixed() 的小数位数小于传入的实际数字的小数位数并且这些小数位是大数字时,这确实有舍入的轻微缺点。例如(4.99999999999).toFixed(10) 会给你5.0000000000。但是,如果您可以确保小数位数低于传递给toFixed() 的位数,这不是问题。但是,它确实使@TJ 的解决方案更加强大。

【讨论】:

    【解决方案4】:

    警告! 当前接受的解决方案在某些情况下会失败,例如使用 4.27 它错误地返回 4.26。

    这是一个始终有效的general solution

    (也许我应该将此作为评论,但在撰写本文时,我没有所需的声誉)

    【讨论】:

      【解决方案5】:

      大家好消息!一段时间以来,有一个替代方案:toLocaleString()

      虽然它不完全用于舍入,但有一些有用的选项参数。

      最小整数位数

      要使用的最小整数位数。可能的值是从 1 > 到 21;默认值为 1。

      最小分数位数

      要使用的最小小数位数。

      可能的值是从 0 > 到 20;纯数字和百分比格式的默认值为 0; t

      货币格式的默认值是次要单位的数量 ISO 4217 货币代码列表提供的数字(如果列表为 2 不提供该信息)。

      最大分数位数

      要使用的最大小数位数。

      可能的值是从 0 > 到 20;纯数字格式的默认值是 minimumFractionDigits 和 3 中的较大者

      货币格式的默认值是 minimumFractionDigits 和次要单位数中的较大者 ISO 4217 货币代码列表提供的数字(如果列表为 2 不提供该信息);百分比格式的默认值 是 minimumFractionDigits 和 0 中的较大者。

      minimumSignificantDigits

      要使用的有效数字的最小数量。可能的值是从 1 到 21;默认值为 1。

      ma​​ximumSignificantDigits

      要使用的最大有效位数。可能的值是从 1 到 21;默认值为 21。

      使用示例:

      var bigNum = 8884858284485 * 4542825114616565
      var smallNum = 88885 / 4545114616565
      
      console.log(bigNum) // Output scientific
      
      console.log(smallNum) // Output scientific
      
      // String
      console.log(
        bigNum.toLocaleString('fullwide', {useGrouping:false})
      ) 
      
      // Return a string, rounded at 12 decimals
      console.log(
        smallNum.toLocaleString('fullwide', {maximumFractionDigits:12})
      )
      
      
      // Return a string, rounded at 8 decimals
      console.log(
        smallNum.toLocaleString('fullwide', {minimumFractionDigits:8, maximumFractionDigits:8})
      )
      
      // Return an Integer, rounded as need, js will convert it back to scientific!
      console.log(
        +smallNum.toLocaleString('fullwide', {maximumFractionDigits:12})
      )
      
      // Return same Integer, don't use parseInt for precision!
      console.log(
        parseInt(smallNum.toLocaleString('fullwide', {maximumFractionDigits:12}))
      )

      但是这与问题不符,是四舍五入:

      function cutDecimals(number,decimals){
        return number.toLocaleString('fullwide', {maximumFractionDigits:decimals})
      }
      
      console.log(
        cutDecimals(4.3455,2),
        cutDecimals(2.768,2),
        cutDecimals(3.67,2)
      )

      ​​​​​​​

      【讨论】:

        【解决方案6】:

        使用 toPrecision :)

        var y = 67537653.76828732668326;
        y = (String(y).indexOf('.') !== -1) ? +y.toPrecision(String(y).indexOf('.') + 2) : +y.toFixed(2);
        // => 67537653.76
        

        第二行的2表示小数位数,这种方式返回一个数字,如果要字符串去掉“+”运算符。

        【讨论】:

          猜你喜欢
          • 2010-10-22
          • 2011-03-10
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多