自编java细节(3)----之你不可能得到正确的结果
来源:互联网 发布:南风知我意txt 下载 编辑:程序博客网 时间:2024/06/06 05:54
我很高兴这一刻我又有了新的进展,又找到了新的好玩的东西,
先来看看下面的一段程序
public static boolean isOdd(int i){return i % 2 == 1;}你可否会考虑一下上面的方法是否总是正确,它是否会得到意想不到的结果呢??如果你认为它是正确的话,那么你的答案和我一开始的答案一样,我的初衷也是正确的,但是既然在这里摆上了一个这样的问题,那么总能说明的一个问题就是它是不正确的,但是到底是为什么呢?还要追寻到java的一个小小的细节问题上。
是的问题的根源都在这里:
这是关于java中'%'操作符的一个传说,在java中它被定义为任何时候都会满足以下的式子:
其中a是任何整数,b是任何非零整数。
(a/b)*b + (a%b) == a ----这个式子在java的%运算中,被定义为总是返回true
这看起来可能最初并没有什么问题,但是%运算符还有另一个特性就是 它运算的结果和被除数的符号是一样的,
所以现在上面的方法的错误之处就显而易见了,当被除数是负数的时候,这个方法返回的都是-1,而不是1,所以这也是设计不到位的问题,
所以最后的结果就是在用上面的方法进行判断的时候,只要被除数是负数的情况,该方法总返回false,在被除数是正数的情况下,它有1/2的概率会返回false,所以该方法在3/4的情况下返回的都是false,这显然不是正确的。
所以要在判断的时候 时刻关注 %运算结果的符号问题, 现在我需要对上面的方法进行改装public static boolean idOdd(int i){ return a%b != 0;}
所以以后再写方法的时候一定要准确测试你的方法在参数是整数负数或者是0的时候是否可以正确表达语义。
如果你在一个性能临界的环境中编写方法的时候可以使用这个方法public static boolean idOdd(int i){return (a & b) != 0;}
最后祝福大家中秋快乐
- 自编java细节(3)----之你不可能得到正确的结果
- 自编java细节(1)
- 自编java细节(2)
- JAVA解惑你的不可能
- 你不可能在乎的声音
- 如何使你的Sql 语句可以和null 值比较得到正确的结果,而不是永远都返回0条记录
- java中二叉树的“自编、自导、自演”
- java运算计算的方式得到的结果和通过计数器得到的结果不一样
- 事情的结果可能不是你想得到的,但是你应该得到的。
- 听说苹果手机的一个BUG是无法得到如图的正确结果?
- 你不可能写出完美的软件
- 需先将项目清理一遍 而后再调试时,才能得到正确的结果
- 今天彻底放弃了一段不可能有结果的爱情
- Java执行SQL代码块,得到dbms_output.put_line的结果
- java--你可能忽略的细节(一)
- java--你可能忽略的细节(二)
- Java关于日期的自编的类
- 【很早以前的作品】自编游戏之NationFight
- 解决浮动后IE6会产生双倍的距离
- Lisp.函数作为数据
- DBUtils框架简化JDBC开发
- java 代码块分类说明
- javascript作用域和声明提升
- 自编java细节(3)----之你不可能得到正确的结果
- java中的Vector的用法
- Chp2.Javascript类型与语法
- [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:XFirete
- DOM中的navigate()函数
- DOM碰到的小问题
- #ifdef,#else,#endif和#ifndef的用法
- switch语句的一点收获
- 如何在linux终端下查询C函数