改善Java程序的建议(每日5条)4

目录
  • 建议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方法设置精度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值