【问题标题】:How can I remove the decimal part from JavaScript number?如何从 JavaScript 数字中删除小数部分?
【发布时间】:2011-11-30 07:21:20
【问题描述】:

我有除法的结果,我希望舍弃结果数的小数部分。

我该怎么做?

【问题讨论】:

    标签: javascript frontend decimal number-formatting division


    【解决方案1】:

    你可以使用...

    ...取决于您要如何删除小数。

    Math.trunc() 尚不支持所有平台(即 IE),但同时您可以轻松使用polyfill

    另一种截断小数部分并具有出色平台支持的方法是使用bitwise operator(例如|0)。对数字使用按位运算符的副作用是将其操作数视为带符号的 32 位整数,因此会删除小数部分。请记住,这也会破坏大于 32 位的数字。


    您可能还在谈论浮点运算的十进制舍入的不准确性。

    Required Reading - What Every Computer Scientist Should Know About Floating-Point Arithmetic.

    【讨论】:

    • 请记住,当数字为时,Math.floor()增加数值。因此Math.floor(-1.2) -> -2Math.floor(1.2) -> 1parseInt(-1.2) -> -1@FloydPink 提到)将按预期丢弃 正数负数 数的小数部分。
    • @PaulT.Rawkeen 您也可以使用按位运算符删除小数部分,但请记住它也会截断为 32 位。
    • 以下显示此答案不稳定:> (2.305*100)|0 > 230 > (2.3*100)|0 > 229
    • @Jake 2.3*100 在 javascript 中的结果是 229.99999999999997,因此在您的示例中,位运算符似乎正确地完成了它的工作。
    • 我不明白为什么IE没有涵盖这么好的工具,Math.trunc()
    【解决方案2】:

    使用Math.round()

    (亚历克斯的回答更好;我做了一个假设:)

    【讨论】:

      【解决方案3】:

      你也可以这样做

      parseInt(a/b)
      

      【讨论】:

      • 请注意,parseInt 不能可靠地用于大数,因为它首先将其参数转换为字符串,而对于大数,结果将使用指数表示法。例如:var n = 22222222222222222222222; parseInt(n); 将返回2,因为n.toString() 返回2.2222222222222223e+22
      • 它也没有使用parseInt() 来实现它的目的,即在字符串中获取一个数字并返回一个Number
      【解决方案4】:

      使用Math.round() 函数。

      Math.round(65.98) // will return 66 
      Math.round(65.28) // will return 65
      

      【讨论】:

      • 为了完整起见,这是纯 JavaScript,而不是查询。
      • $.round = Math.round ;)
      • Math.round 并没有真正回答这个问题。问题是如何忽略数字的小数部分。在此处答案显示的示例中,OP 希望在两种情况下都返回 65。 Math.round 将返回 66 或 65(如上所述)。
      【解决方案5】:

      你也可以使用以下代码显示小数点后的一定位数(这里是2位):

      var num = (15.46974).toFixed(2)
      console.log(num) // 15.47
      console.log(typeof num) // string

      【讨论】:

      【解决方案6】:

      toFixed 的行为类似于圆形。

      对于类似地板的行为,请使用 %:

      var num = 3.834234;
      var floored_num = num - (num % 1); // floored_num will be 3
      

      【讨论】:

      • 为什么你觉得这比使用 Math.floor 更好?您的解决方案似乎不必要地复杂且缓慢。我不知道 Math.floor 是如何工作的,但我希望它会更加优化。另外,我想知道您的解决方案是否会出现浮点舍入错误。
      【解决方案7】:

      对于 ES2015,Math.trunc() 可用。

      Math.trunc(2.3)                       // 2
      Math.trunc(-2.3)                      // -2
      Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
      Math.trunc("2.3")                     // 2
      Math.trunc("two")                     // NaN
      Math.trunc(NaN)                       // NaN
      

      IE11 或更低版本不支持它,但在 Edge 和其他所有现代浏览器中都可以使用。

      【讨论】:

      • 知道任何允许截断到 X 位小数的变体吗?认为Math.trunc(value * Math.pow(10,x)) / Math.pow(10,x) 会起作用是不是太天真了?
      • 嘿 Jamie,看起来这适用于大多数情况,但它容易受到浮点陷阱的影响。例如value = 2.3x = 2 将返回 2.29。我没有更好的建议。
      • 这对我来说听起来是正确的答案。没有四舍五入的上限或下限。负数没有问题。只需丢弃小数。正如问题所要求的那样。
      【解决方案8】:

      您还可以使用位运算符来截断小数。

      例如

      var x = 9 / 2;
      console.log(x); // 4.5
      
      x = ~~x;
      console.log(x); // 4
      
      x = -3.7
      console.log(~~x) // -3
      console.log(x | 0) // -3
      console.log(x << 0) // -3
      

      按位运算比数学函数效率高得多。双非按位运算符似乎也比x | 0x &lt;&lt; 0 按位运算略胜一筹。

      // 952 milliseconds
      for (var i = 0; i < 1000000; i++) {
          (i * 0.5) | 0;
      }
      
      // 1150 milliseconds
      for (var i = 0; i < 1000000; i++) {
          (i * 0.5) << 0;
      }
      
      // 1284 milliseconds
      for (var i = 0; i < 1000000; i++) {
          Math.trunc(i * 0.5);
      }
      
      // 939 milliseconds
      for (var i = 0; i < 1000000; i++) {
          ~~(i * 0.5);
      }
      

      另外值得注意的是,按位非运算符优先于算术运算,因此您可能需要用括号将计算括起来以获得预期的结果:

      x = -3.7
      
      console.log(~~x * 2) // -6
      console.log(x * 2 | 0) // -7
      console.log(x * 2 << 0) // -7
      
      console.log(~~(x * 2)) // -7
      console.log(x * 2 | 0) // -7
      console.log(x * 2 << 0) // -7
      

      更多关于双位非运算符的信息可以在Double bitwise NOT (~~)找到

      【讨论】:

      • 可能效率很低。但是,我建议使用“数学”函数,因为它更具可读性。
      • 如果整数不表示为 32 位有符号整数 (stackoverflow.com/a/7488075/3655192),这可能不起作用
      • 如果这样做,请确保将按位运算包装在具有合理名称的函数中。否则,准备好让你的同事把你钉在十字架上。
      【解决方案9】:

      对于 ES6 实现,请使用如下内容:

      const millisToMinutesAndSeconds = (millis) => {
        const minutes = Math.floor(millis / 60000);
        const seconds = ((millis % 60000) / 1000).toFixed(0);
        return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;
      }
      

      【讨论】:

        【解决方案10】:

        这是在上述帖子的帮助下详细解释的压缩:

        1. Math.trunc() : 用于删除后面跟点的数字。它隐式转换。但是,在 IE 中不支持。

        例子:

        Math.trunc(10.5) // 10

        Math.trunc(-1​​0.5) // -10

        其他替代方式:使用按位非运算符:

        例子:

        x= 5.5

        ~~x // 5

        2。 Math.floor() : 用于给出最小整数值posible。所有浏览器都支持它。

        例子:

        Math.floor(10.5) // 10

        Math.floor(-10.5) // -11

        3。 Math.ceil() : 用于给出可能的最高整数值。所有浏览器都支持它。

        例子:

        Math.ceil(10.5) // 11

        Math.ceil(-10.5) // -10

        4. Math.round() : 四舍五入到最接近的整数。所有浏览器都支持它。

        例子:

        Math.round(10.5) // 11

        Math.round(-10.5)// -10

        Math.round(10.49) // 10

        Math.round(-10.51) // -11

        【讨论】:

          【解决方案11】:

          这是为那些想要阻止用户输入十进制数字的人准备的

          <input id="myInput" onkeyup="doSomething()" type="number" />
          
          <script>
              function doSomething() {
          
                  var intNum = $('#myInput').val();
          
                  if (!Number.isInteger(intNum)) {
                      intNum = Math.round(intNum);
                  }
          
                  console.log(intNum);
              }
          </script>
          

          【讨论】:

            【解决方案12】:

            如果您不关心路由,只需将数字转换为字符串,然后删除句点之后的所有内容,包括句点。无论有没有小数,这都有效。

            const sEpoch = ((+new Date()) / 1000).toString();
            const formattedEpoch = sEpoch.split('.')[0];
            

            【讨论】:

              【解决方案13】:

              您可以使用 .toFixed(0) 删除完整的小数部分或在参数中提供您希望小数被截断的数字。

              注意:toFixed 会将数字转换为字符串。

              【讨论】:

              • 感谢您的注意——我不需要字符串
              【解决方案14】:

              例如:

              var x = 9.656;
              x.toFixed(0);           // returns 10
              x.toFixed(2);           // returns 9.66
              x.toFixed(4);           // returns 9.6560
              x.toFixed(6);           // returns 9.656000 
              

              parseInt("10");         // returns 10
              parseInt("10.33");      // returns 10
              parseInt("10 20 30");   // returns 10
              parseInt("10 years");   // returns 10
              parseInt("years 10");   // returns NaN  
              

              【讨论】:

              • 我不明白为什么这个答案没有任何荣誉,它对我有用,并且它已集成到 react / JavaScript 标准中
              【解决方案15】:

              Math.trunc()~~ 删除 decimal partinteger part 没有任何影响。

              例如:

              console.log(Math.trunc(3.9)) // 3
              console.log(~~(3.9)) // 3
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-12-01
                • 1970-01-01
                • 1970-01-01
                • 2014-02-15
                • 2023-01-08
                • 1970-01-01
                • 2012-09-07
                相关资源
                最近更新 更多