目录
- 建议16 用偶数判断,不用基数判断
- 建议17 用整数类型处理货币
- 建议18 不要让类型默默转换
- 建议19 边界问题
- 建议 20 四舍五入问题
建议16 用偶数判断,不用基数判断
判断一个数是奇数还是偶数,规则十分简单。
public class Test{
public static void main(String[] args){
//接收键盘输入参数
Scanner input = new Scanner(System.in);
System.out.print("请输入一个数字");
while(input.hasNextInt()){
int i = input.nextInt();
String str = i + "->" + (i%2==1?"奇数":"偶数");
System.out.print(str);
}
}
}
输入多个数组,然后判断每个数字的奇偶性。
1->奇数
2->偶数
3->偶数
-1->偶数
-2->偶数
前三个还是很靠谱的怎么到-1怎么会是偶数啊。我们先来看下Java中的取余操作(%标示符代码)
public static int remainder(int dividend,int divisor){
return divident - divident / divisor * divisor;
}
看到这段代码我们就知道了 当输入-1时 运算结果是-1当然不等于1,所以就被判定为偶数了,也就是我们所说的判断失误。那么我们就应该修改自己的代码
i % 2 == 0 ? "偶数":""奇数;
建议17 用整数类型处理货币
在日常生活中最容易接触到的小数就是货币,譬如说你付给售货员10元,购买了个9.60的商品,售货员找钱给你0.4元。
public class Test{
public static void main(String[] args){
System.out.println(10.00-9.60);
}
}
我们期望的结果是0.4元,也应该是这个数字,但是打印出来的是0.40000000000000000036,这是因为计算机中浮点数有可能是不准确的,它为虚衔接近准确值,而不能完全精确。这是由浮点数的存储规则所决定的"乘2取整,顺序排列"法
当然一也可以对其进行取整,但是这里有个很深的问题,就是金融行业的计算方法,会计系统一般记录小数点后4位小数,但是在汇总、展现、报表中,则只记录小数点后的2位小数,如果使用浮点数来计算货币想想看,在大批量的加减乘除后结果会有多大的差距。
对此我们使用有两种方法解决
- 方法一:使用BigDecimal
BigDecimal是专门为了弥补浮点数无法精确计算的缺憾而设计的类,本身提供了加减乘除的常用数学算法。特别是数据库Decimal类型的字段映射时,BigDecimal是最优的解决方法 - 方法二: 使用整形
把参与运算的值扩大100倍,并转换为整形,然后展现时在缩小100倍。
建议18 不要让类型默默转换
光速时每秒30万公里,根据光纤,计算月亮与地球,太阳与地球的距离
public class Test{
public static final int LIGHT_SPEED = 30 * 10000 * 1000;
public static void main(String[] args){
System.out.println("太阳到地球需要8分钟");
long dis2 = LIGHT_SPEED * 60 *8;
System.out.print(dis2 +"米");
}
}
结果是-2028888064米
结果竟然是负数,我们使用long类型了啊为什么会变负。是因为Java先运算然后再进行类型转换的,也就是运算参数都是Int类型,三者相乘的结果虽然也是int类型,但是已经超过了int的最大值,所以其值就是负值了,再转换成long类型还是负。所以我们应该在后面加个L
long dis2 = LIGHT_SPEED * 60L * 8;
注意 基本类型转换时,使用主动声明方式减少不必要的Bug
建议19 边界问题
public class Test{
public final static int LIMIT = 2000;
public static void main(String[] args){
int cur = 1000;
Scanner input = new Scanner(System.in);
System.out.println("请输入需要预定的数量:");
while(input.hasNextInt()){
int order = input.nextInt();
if(order>0 && order+cur<=LIMIT){
System.out.print(order);
}else{
System.out.print("超过限定");
}
}
}
}
这是一个简易的订单处理程序,cur代表会员已经拥有的产品数
LIMIT是一个会员最多拥有的产品数量,如果当前预定数量与拥有数量之和超过最大数量,则预定失败,否则成功
让我们测验一下 800 2147483647
第一个预定成功我们不意外,但是第二个竟然也成功了,怎么回事
其实就是order 值 2147483647+1000超出了int范围,结果时-2147482649,当然小于正数2000了。也就是数字越界导致检验条件失效。所以我们要做边界测试。
建议 20 四舍五入问题
四舍五入经典案例
public class Test{
public static void main(String[] args){
System.out.println("10.5近似值:"+Math.round(10.5));
System.out.println("-10.5近似值:"+Math.round(-10.5));
}
}
结果是
10.5近似值 11
-10.5近似值 -10
绝对值相同的两个数字为什么结果不同了呢,这是由于Math.round的舍入规则决定的(正无穷方向舍入规则)四舍五入的误差是 舍入位的一半
但是这种运用到银行利息计算中就不好了
所以我们有了银行家舍入近似算法也就是在BigDecimal中 setScale方法设置精度