DLancerC

Java Puzzler(1-4)

1. 奇数性

1
2
3
public static boolen isOdd(int i){
return i %2 ==1;
}

上面的method是错误的,会在1/4的时间里返回的是错误值
a % b = c中c的值取决于a;只要a为正,无论b取何值,若有余数,c一定为正,同理可知a为负,c一定为负值。

correct method:

1
2
3
4
5
6
public static boolen idOdd(int i){
rutrun i%2 != 0;
}
punlic static boolen idOdd(int i){
retrun (i&1)!=0;
}

2. 找零时刻

1
2
3
4
5
public class change{
punlic static void main (String[] args){
System.out.println(2.00-1.10);
}
}

以上不会输出 0.9,而是0.899999999999
使用printf("%.2f%n"2.00-1.00);但是使用的double。
△ Double是在一个很广的值域上提供一个很好的相识值,并不是精确值。
在需要精确答案是,建议是要避免是用float和double,对于货币计算,建议使用int和long,Bigdecimal
一定要使用Bigdecimal(String)构造器,千万不要使用BIgdecimal(double),返回仍会是不精确的值。

3. 长整除

1
2
3
4
5
6
7
public class LongDivsion{
public static void main(String[] args){
final long a=24*60*60*1000*1000;
final long b=24*60*60*1000;
System.out.println(a/b);
}
}

以上返回不会输出1000,而是5。
因为24*60*60*1000*1000会溢出,它并不是一个Long型,而是先算出结果后在转换成Long型的a。

1
2
3
4
5
6
7
public class LongDivsion{
public static void main(String[] args){
final long a=24L*60*60*1000*1000;
final long b=24L*60*60*1000;
System.out.println(a/b);
}
}

△当操作很大的数时一定要提防溢出