您的位置:首页 > Web前端 > JavaScript

Javascript小技巧,去掉小数位并且不会四舍五入

2012-01-30 17:53 239 查看
varn3=52.3685;
document.writeln(n3>>0);//52
可以去掉小数。

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

如上代码,就是这么简单

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

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

{
n=52.123456;
//alert(typeofn);
alert(n);
}
//有符号右移
{
n=52.123456;
varn2=n>>0;
//alert(typeofn2);
alert(n2);
}
//无符号右移
{
n=52.123456;
varn3=n>>>0;
//alert(typeofn3);
alert(n3);
}
//左移0位
{
n=52.123456;
varn4=n<<0;
//alert(typeofn4);
alert(n4);
}
//按位或or
{
n=52.123456;
varn5=n|0;
//alert(typeofn5);
alert(n5);
}
//按位异或xor
{
n=52.123456;
varn6=n^0;
//alert(typeofn6);
alert(n6);
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

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

11.7.1TheLeftShiftOperator(<<)
Performsabitwiseleftshiftoperationontheleftoperandbytheamountspecifiedbytherightoperand.
TheproductionShiftExpression:ShiftExpression<<AdditiveExpressionisevaluatedasfollows:
1.EvaluateShiftExpression.
2.CallGetValue(Result(1)).
3.EvaluateAdditiveExpression.
4.CallGetValue(Result(3)).
5.CallToInt32(Result(2)).
6.CallToUint32(Result(4)).
7.Maskoutallbuttheleastsignificant5bitsofResult(6),thatis,computeResult(6)&0x1F.
8.LeftshiftResult(5)byResult(7)bits.Theresultisasigned32bitinteger.
9.ReturnResult(8).|



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

TheoperatorToInt32convertsitsargumenttooneof232integervaluesintherange-231through231-1,inclusive.Thisoperatorfunctionsasfollows:
1.CallToNumberontheinputargument.
2.IfResult(1)isNaN,+0,-0,+∞,or-∞,return+0.
3.Computesign(Result(1))*floor(abs(Result(1))).
4.ComputeResult(3)modulo232;thatis,afiniteintegervaluekofNumbertypewithpositivesignandlessthan232inmagnitudesuchthemathematicaldifferenceofResult(3)andkismathematicallyanintegermultipleof232.
5.IfResult(4)isgreaterthanorequalto231,returnResult(4)-232,otherwisereturnResult(4).
最后来看那个floor是什么意思,这里重点看第三步的后半拉,就是那个floor是干什么滴
floor(x)=x-(xmodulo1)
看见没,就在这一步把小数干掉了
Floor(x)等于x减去x模上1

N=52.123456–52.123456%1
=52.123456-0.1234559999999
=52
搜代斯呐,春节快乐~


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: