zoukankan      html  css  js  c++  java
  • Javascript小技巧,去掉小数位并且不会四舍五入

       1:  var n3 = 52.3685;
       2:  document.writeln(n3 >> 0);// 52
       3:  可以去掉小数。

    如上代码,就是这么简单

    右移位操作导致小数部分丢失,为何会这样呢?左移位可以吗?移位操作是否都有如此功能呢?

    带着疑问又写了一段代码用来测试以上想法,继续上代码

       1:  {
       2:      n = 52.123456;
       3:      //alert(typeof n);
       4:      alert(n);
       5:  }
       6:  //有符号右移
       7:  {
       8:      n = 52.123456;
       9:      var n2 = n >> 0;
      10:      //alert(typeof n2);
      11:      alert(n2);
      12:  }
      13:  //无符号右移
      14:  {
      15:      n = 52.123456;
      16:      var n3 = n >>> 0;
      17:      //alert(typeof n3);
      18:      alert(n3);
      19:  }
      20:  //左移0位
      21:  {
      22:      n = 52.123456;
      23:      var n4 = n << 0;
      24:      //alert(typeof n4);
      25:      alert(n4);
      26:  }
      27:  //按位或or
      28:  {
      29:      n = 52.123456;
      30:      var n5 = n | 0;
      31:      //alert(typeof n5);
      32:      alert(n5);
      33:  }
      34:  //按位异或xor
      35:  {
      36:      n = 52.123456;
      37:      var n6 = n ^ 0;
      38:      //alert(typeof n6);
      39:      alert(n6);
      40:  }

    那,这里不卖关子,直接给出测试结果来:以上五种方法均可以去掉小数点;然而为什么会这样呢?
    翻翻EAMCScript规范吧,或许里边会有答案,见http://bclary.com/2004/11/07/#a-9.5

    先来看看位操作都做了什么,下边是位操作的实现步骤,重点在第五,第六步

    11.7.1 The Left Shift Operator (<< )

    Performs a bitwise left shift operation on the left operand by the amount specified by the right operand.

    The production ShiftExpression : ShiftExpression << AdditiveExpression is evaluated as follows:

    1. Evaluate ShiftExpression.

    2.Call GetValue(Result(1)).

    3.Evaluate AdditiveExpression.

    4. Call GetValue(Result(3)).

    5.Call ToInt32(Result(2)).

    6.Call ToUint32(Result(4)).

    7.Mask out all but the least significant 5 bits of Result(6), that is, compute Result(6) & 0x1F.

    8.Left shift Result(5) by Result(7) bits. The result is a signed 32 bit integer.

    9.Return Result(8).|

    再来看看那锅ToInt32干了什么,重点在第三步
    9.5 ToInt32: (Signed 32 Bit Integer)

    The operator ToInt32 converts its argument to one of 232 integer values in the range -231 through 231-1, inclusive. This operator functions as follows:

    1. Call ToNumber on the input argument.

    2. If Result(1) is NaN, +0, -0, +∞, or -∞, return +0.

    3. Compute sign(Result(1)) * floor(abs(Result(1))).

    4. Compute Result(3) modulo 232 ; that is, a finite integer value k of Number type with positive sign and less than 232 in magnitude such the mathematical difference of Result(3) and k is mathematically an integer multiple of 232 .

    5. If Result(4) is greater than or equal to 231 , return Result(4)-232 , otherwise return Result(4).

     

    最后来看那个floor是什么意思,这里重点看第三步的后半拉,就是那个floor是干什么滴

    floor(x) = x-(x modulo 1)

    看见没,就在这一步把小数干掉了

    Floor(x) 等于x减去x模上1

    N= 52.123456 – 52.123456%1

    =52.123456-0.1234559999999

    =52

     

    搜代斯呐,春节快乐~


     

     
     
     


    ------------------------------------------
    除非特别声明,文章均为原创,版权与博客园共有,转载请保留出处
    BUY ME COFFEE
  • 相关阅读:
    序列、元组、列表(基本的增、删、改、查)
    Python基础运算符(算数、比较、赋值、逻辑、成员)
    2015年9月14日记事
    2014年3月31日梦
    华为S5700系列交换机配置文件导出、导入
    C语言单链表简单实现(简单程序复杂化)
    北邮《大学英语2》第三次阶段作业带答案
    C++走向远洋——30(六周,项目一1.0)
    C++走向远洋——29(长方柱类)
    C++走向远洋——28(项目三,时间类,2)
  • 原文地址:https://www.cnblogs.com/kkun/p/2332309.html
Copyright © 2011-2022 走看看