日期:2014-05-16  浏览次数:20422 次

Javascript Number对象介绍

/*
Javascript语言中的Number对象
Number是javascript的原始类型(primitive type),值存储在栈上
在C#语言中,能表示数字的类型有很多,如int,float,double,decimal等
C#中的这些东东在javascript语言中,就只有Number对象,仅此一家,别无分店
业务范围涵盖整数和浮点数,插播段广告
*/
var foo = 10
window.alert = function(x){
document.writeln(x + "<br />");
}
/*


整数业务中的进制转换

无论以何种进制表示的数字其运算结果总是以十进制表示
Number公司提供了各种进制的表示法,例如二进制,八进制,十六进制以及十进制和任意进制,
但是不论神马进制的,一但进行运算后均以十进制表示运算结果,下边的输出都是10进制结果:10
知识点,八进制表示时首字符必须是0,十六进制表示时前两位必须是0x
无论您以什么货币支付,美刀,英镑啥的,我们都以RMB结算
*/
//定义16进制fee16 = 0xA,output 10
var fee16 = 0xA; alert(fee16)
//定义八进制fee8 = 012,output 10
var fee8 = 012; alert(fee8)
//十进制fee = 10,output 10
var fee = 10; alert(fee)
/*
从十进制转换到其它进制
使用toString(parameter)基模式就OK,一共两种模式,基模式和默认模式
默认模式就是基模式的重载而已,当在Number对象上调用toString()方法时,实际上调用的是toString(10)
*/
fee = 10iphone5
alert(fee.toString(2))//1010
alert(fee.toString(8))//12
alert(fee.toString(16))//a
alert(fee.toString())//等同于下边一行的代码
alert(fee.toString(10))//10
alert(fee.toString(3))//101
/*

OK,问题出来了,下边这行代码输出神马?
*/
alert("----------")
fee = 010
alert(fee.toString())
/*
前边说了,该公司永远以RMB结算,
所以嘞,010首先会转换成十进制变成8,没注意到这是个八进制表示法?
请认真体会[定义八进制fee8 = 012,output 10]
这里的010会首先进行八进制到十进制的转换,然后调用toString输出结果:8
世界上只有010,011,012,013,014,015,016,017,-010,-011,-012,-013,-014,-015,-016,-017
共计16个数有这个问题,在八进制中没有9,所以09一定不是八进制,继续输出9
而08由于该进位了,没有进位依然不是八进制,输出8,07和07以下是不是八进制无所谓了,转换成十进制还是原值
基于同样的原因,到018之后同样不存在这个问题了,只有010到017调用toString时会减2,-010到-017则加2
C#动态生成XML并在前台用javascript读取
Number对象的特殊值,如非数,无穷大,无穷小,大于无穷大,小于无穷小等,比较简单,看清单
Number.MAX_VALUE,Number类型能存储的值的区间上限
Number.MIN_VALUE,Number类型能存储的值的区间下限
Number.NEGATIVE_INFINITY,当计算结果小于区间下限值是被赋值为NEGATIVE_INFINITY
Number.POSITIVE_INFINITY,当计算结果大于区间上限值时被赋值为POSITIVE_INFINITY
window.Infinity表示无穷大
Number.NaN,表示"非数字",Not a Number,多发生在转换到类型Number失败时,如转换"blue"为数字时就返回NaN
然而NaN不等于NaN,表达式NaN == NaN 结果为false,为什么妮?
举个例子,a是NaN吧,b也是NaN吧,那么代入上述公式,a == b吗?非数的情况太多,无法穷举
一定要做NaN等于判断是推荐使用isNaN函数进行判断,后边有介绍
同样的原因,也不推荐使用wndow.Infinity进行等于运算,推荐的做法是使用方法isFinite验证是否是无穷大数
*/
alert("NaN----------")
alert(NaN == NaN)//false
alert(null == null)//true
alert(undefined == undefined)//true
alert(isFinite(Number.MAX_VALUE + 1))//true
alert(isFinite(Number.MIN_VALUE - 1))//true
/*


Number对象相关的方法
toFixed(parameter)方法返回的是具有指定位数小数的数字的字符串表示
*/
alert(foo.toFixed(2))//output 10.00
/*
toExponential(parameter)方法返回的是用科学计数法表示的数字的字符串形式
*/
alert(foo.toExponential(2))//output 1.00e+1
/*
toPrecision(parameter)方法根据最有意义的形式来返回数字的预订形式或指数形式.
它有一个参数,即用于表示数字的数字总数(不包括指数)
*/
alert(foo.toPrecision(4))//output 10.00
/*
注意:以上三个方法都会进行舍入操作
valueOf方法返回Number的原始值
*/
alert(foo.valueOf())//output 10
/*
再加上上边提到的isNaN,isFinite,toString方法,不重复介绍了.



其它类型转换成Number对象
parseInt(string,radix)
该方法首先查看位置0处的字符,判断它是否是个有效数字,如果不是则返回NaN,方法结束.
如果是,继续查看位置1处字符,进行同样的测试,这一过程将持续到发现非有效数字为止,此时parseInt
将把该字符之前的字符串转换成数字返回,例如1234abcd转换成数字后为1234,遇到a后结束
同toString方法类似,这个方法的第二个参数表示基,默认为10,
即当调用parseInt("1234abcd")时,相当于调用重载方法parseInt("1234abcd",10)
*/
alert("parseInt-------------------------")
var goo = "1234abcd";
alert(parseInt(goo))//output 1234
//等同于
alert(parseInt(goo,10))//output 1234
//表示输出goo的8进制值
alert(parseInt(goo,8))//output 668
//表示输出goo的16进制值
alert(parseInt(goo,16))//output 305441741
/*
parseFloat(string)
parseFloat与parseInt方法类似,从位置0处开始查看每个字符,直到找到第一个非有效的字符为止,
然后把该字符之前的字符串转换成数字,不过,对于这个方法来说,第一个出现的小数点是有效字符,但第二个小数点就是无效字符了,
另一处不同是字符串必须以十进制表示,没有基模式,该方法会忽略前导0,八进制的0908将被解析成908,而对于0xA该方法将返回NaN
*/
alert("parseFloat-------------------------")
alert(parseFloat(goo))//output 1234
/*

Number的一元运算
一元加法对数字没任何影响,但是对字符串却有影响,它将字符串转换成整型
一元减法等