-
2009-09-16
进制转换隐藏的陷阱 - [群英散语]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://www.my1px.cn/logs/46614030.html
先问一个js问题:parseInt('010')是值是多少?如果你回答10,那你就继续看下去吧。
曾经碰到过类似(进制转换引起的)的问题,那是在做项目的时候,校验区间的时候总是有时候会莫名其妙的错,比如09与010的大小比较。后来虽然解决,但一直没有好好总结一下。直至前天,沉鱼也碰到了这个问题,在群里提及,我才想想,这是我的一个盲点,而且虽然比较少会有这种问题,但也应该重视一下,免得下次又给忘掉。
先贴一段对话:
沉鱼:(14:50:47):
下午茶时间,来点小题目提神醒脑,以下加法分别输出值为多少?
05+06
010+06
010+'06'
'010'+06
parseInt(010)+05
释然:(15:02:28):
0开头是几进制来着?
云谦:(15:02:33):
8
紫凝:(15:02:58):
05+06
010+06
010+'06'
'010'+06
parseInt(010)+05 我砸没看董呢!
沉鱼:(15:03:12):
今天写代码,有个小bug整了半天,就是这该死的进制转换问题,哈哈
紫凝:(15:04:00):
= =?
释然:(15:04:13):
11 14 806 0106 13
龙刚:(15:06:26):
八进制好像不太用到吧?!
释然:(15:06:45):
我一般记不住0和0x哪个是哪个...
沉鱼:(15:08:09):
八进制是不太用的到,但是如果你要处理一系列格式化的数据,就可能会犯错了,比如
01,02,03...11,12
龙刚:(15:08:29):
那统一用字符串吧~
沉鱼:(15:08:30):
释然正解啊
字符串会有同样的问题
龙刚:(15:10:57):
统一转成十进制吧,parseInt有提供radix参数
最后再转成字符吕来补零的操作
沉鱼:(15:11:53):
呵呵,跟我一样,再次掉进陷阱
paseInt(010),parseInt(010,10),是一样的结果
也就是说两种情况我都不能使010==10
小虎:(15:12:31):
010 >>> 0
沉鱼:(15:12:58):
楼上解释下按位移
龙刚:(15:13:05):
010本来就是十进制的8.转到十进制还是8
document.write(parseInt("010",10))
但是对于字符串就不一样了
沉鱼:(15:14:28):
parseInt("010",10)
parseInt(010,10)
嗯,这里确实很不一样,ws啊ws
龙刚:(15:14:36):
alert(010===8)
parseInt(010,10)其实就是parseInt(8,10)...从这段话,其实基本就知道是因为进制转换惹的祸,简言之,0开头表示八进制,010是八进制的,转成10进制就是8,而09也是八进制,但八进制中是没有9的,不知道js在这里是按什么算的,结果还是9,所以在进行比较的时候会出错。小虎提出了一个按位移的方法,这些在校接触过的东西好像都还给学校了,嘿嘿。
弄了个例子,专门针对<js位移运算>,免得又超字数。
收藏到:Del.icio.us







