icebirds吧 关注:33贴子:2,025
  • 2回复贴,共1

【20150925◇心情】063<60?一头撞上一个大坑

取消只看楼主收藏回复

做项目时,遇到一个超级诡异的问题。对于秒数处理的。由于程序中把秒增加了10秒进行提前量进行判断,因此需要考虑对时间进行进位处理。进位的判断是当秒数达到或超过60后,将其减60,并将分钟数+1,然后再判断分钟和小时的进位。逻辑是没有错的。
但诡异的是,即使是处理了进位后,在实际运行的时候,经常会出现 13:23:63 秒这样的情况。在一通追踪检查之后,诡异的发现,居然出现了 63>60 判断为假的神奇结果。检查了N久之后,才找到问题所在。原来问题出在对数字进行格式化时在前面增加的一个0。由于对时间的处理格式,应该是 08:03 这样的格式,所以在中间缓存的数据中,所有秒数都是直接在前面加了0。并且在最终使用时,将字符串截断为最后两位来使用。打开浏览器的调试控制台,输入 063,你会很惊奇的发现,返回值居然是51。这他喵的是怎么回事?
原来,Javascript 在遇到以0开头且各位数字都不大于7的整数时,会默认把这个数字当作八进制数字处理。就出现了上面的结果。那么 eval("063") 的计算结果,就是十进制的51。
其实说穿了,这并不是什么问题,但在我们学习程序开发的时候,不论是自己找资料学,看书学或者去培训班学,没人会告诉你这一点,只会告诉你,0x开头的数字是十六进制,0b开头的是二进制,0o开头的,就是八进制。有些书或者资料则只会告诉你最常用的0x数字前缀,当然,最操蛋的培训老师,就从没告诉过你有数字前缀这个东西!


IP属地:海南1楼2015-09-25 15:37回复


    IP属地:海南2楼2015-09-25 15:40
    回复
      另外,这里得到的另一个教训,就是正确使用各个函数。我这里犯的最大的错误,是随手把eval 当成了字符串转数字函数使用。这是以前养成的坏习惯,当然,一般情况下这么干也不会出什么错,但并不代表绝对不会出错。如果使用parseInt("063") 是不会出这操蛋问题的。怪只怪我手懒,想少按几次键盘。


      IP属地:海南3楼2015-09-25 15:53
      回复