背景

我正在做一个函数,接收一个正数,然后将数字四舍五入到最接近的整数。

我一直在使用 Math.floor ,但是最近我发现了 Math.trunc

我知道,给定一个正数,两者将返回相同的值,并且它们以完全不同的方式工作。我有兴趣探索这种行为。

问题

  • 哪个更快?
  • 我应该使用哪一个?
  • 最佳答案

    实际上,还有很多其他方法可以从数字中删除小数。但这是可读性和速度之间的权衡。

    选择合适的一个取决于您的需求。如果只需要除去小数点,请始终使用trunc()或按位运算符。floor()ceil()round()在概念上与trunc()有很大不同。

    数学库

    您已经知道这些。始终以标准的非关键代码使用它们。

    var v = 3.14;
    [Math.trunc(v), Math.floor(v), Math.ceil(v), Math.round(v)]
    // prints results
    

    对于不同的输入值,您可以获得这些结果
              t   f   c   r
     3.87 : [ 3,  3,  4,  4]
     3.14 : [ 3,  3,  4,  3]
    -3.14 : [-3, -4, -3, -3]
    -3.87 : [-3, -4, -3, -4]
    

    但这更有趣:)

    二进制运算和bitwise operators

    如果您在代码中查看它们,乍一看可能看不到它们的作用,所以不要在普通代码中使用它们。尽管在某些情况下,它们可能有用。例如,计算<canvas/>中的坐标。它们速度更快,但有局限性。

    从概念上讲,它们是这样工作的:
  • 将操作数转换为32位带符号整数,从而丢失所有小数部分。


  • 按位逻辑运算符
  • 第一个操作数中的每个位与第二个操作数中的对应位配对。 (第一位到第一位,第二位到第二位,依此类推。)
  • 将运算符应用于每对位,然后按位构造结果。

  • 按位移位运算符
  • 这些运算符采用待移位的value和位位置的number来移位value

  • chop

    但是,在 chop 时,我们总是使用0,零,一个false作为第二个操作数,在这种情况下,除了转换为整数外,它对原始值没有任何作用:
    ~~~v|或OR v | 0<<左移v << 0>>签名右移v >> 0>>>零填充右移v >>> 0
    var v = 3.78;
    [ ~~v ,  v | 0 ,  v << 0 ,  v >> 0 ,  v >>> 0 ]
    // prints these results
    
     3.78 : [ 3,  3,  3,  3, 3]
     3.14 : [ 3,  3,  3,  3, 3]
    -3.74 : [-3, -3, -3, -3, 4294967293]
    -3.14 : [-3, -3, -3, -3, 4294967293]
    

    表现

    https://jsperf.com/number-truncating-methods/1

    javascript - Math.floor VS Math.trunc JavaScript-LMLPHP

    关于javascript - Math.floor VS Math.trunc JavaScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38702724/

    10-09 00:21