• 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位移运算>,免得又超字数。


    历史上的今天:

    js位移运算 2009-09-16

    收藏到:Del.icio.us