java表达式之谜

1. -3不是奇数吗?

2. (2.00 -1.10)不等于0.9??

3. long a= 24*60*60*1000*1000;

long b=24*60*60*1000;

a/b不等于1000???

4. System.out.print(12345+5432l). 输出17777????


测试代码及结果:


解惑:

1. 因为-3%2结果为-1而不等于1 ,所以返回false;为了使isOdd函数能正确处理负数,我们可以把i%2==1; 改为 i%2!=0; 这个谜告诉我们定义上正确的事情,编程逻辑上可能并不正确。

2. 这里的逻辑错在并非所有的小数都可以用二进制浮点数精确表示。在这里即2.00及1.10并不能被精确表示为浮点数,java会采用最接近的浮点数表示,但遗憾的是这个最接近的浮点数并非我们所期待的,所以对于浮点数的运算大家要小心了哈。(想起以前自己在这点上也被折腾得够呛的了额)

3. 这里发生了溢出。溢出?也许你会问,声明为long类型也会溢出?对,就是溢出。因为等式右边的24,60,1000都是int类型的,它们所得的结果也会是int类型的(溢出了),所以再赋给a的结果已经是截值后的错误数据了(发生了int-》long的类型转换?错误的结果再转换有什么意义?); 为了防止溢出,我们应该在表达式中的一个或者多个乘数末尾加上L以使表达式正确转换为long类型再运算。 即a = 24L*60*60*1000;等等....

4. 这里错在,我忽悠你了,嘿嘿。其实这里的5432l 是54321L啊,好吧,别生气,写在这里也只为了提醒各位要注意尽量不要使用让自己或别人看着糊涂的变量及表达式。(发一下牢骚,我国的考试不是经常这么考的么,现在想想,哎考得真无聊。)


--参考自《java解惑》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值