1700440290
1700440291
请输入需要预定的数量:800
1700440292
1700440293
你已经成功预定的800个产品!
1700440294
1700440295
这完全满足条件,没有任何问题,继续输入:
1700440296
1700440297
请输入需要预定的数量:2147483647
1700440298
1700440299
你已经成功预定的2147483647个产品!
1700440300
1700440301
看到没,这个数字远远超过了2000的限额,但是竟然预订成功了,真是神奇!
1700440302
1700440303
看着2147483647这个数字很眼熟?那就对了,它是int类型的最大值,没错,有人输入了一个最大值,使校验条件失效了,Why?我们来看程序,order的值是2147483647,那再加上1000就超出int的范围了,其结果是-2147482649,那当然是小于正数2000了!一句话可归结其原因:数字越界使检验条件失效。
1700440304
1700440305
在单元测试中,有一项测试叫做边界测试(也有叫做临界测试),如果一个方法接收的是int类型的参数,那以下三个值是必测的:0、正最大、负最小,其中正最大和负最小是边界值,如果这三个值都没有问题,方法才是比较安全可靠的。我们的例子就是因为缺少边界测试,致使生产系统产生了严重的偏差。
1700440306
1700440307
也许你要疑惑了,Web界面既然已经做了严格的校验,为什么还能输入2147483647这么大的数字呢?是否说明Web校验不严格?错了,不是这样的,Web校验都是在页面上通过JavaScript实现的,只能限制普通用户(这里的普通用户是指不懂HTML、不懂HTTP、不懂Java的简单使用者),而对于高手,这些校验基本上就是摆设,HTTP是明文传输的,将其拦截几次,分析一下数据结构,然后再写一个模拟器,一切前端校验就都成了浮云!想往后台提交个什么数据那还不是信手拈来?!
1700440308
1700440309
1700440310
1700440311
1700440313
编写高质量代码:改善Java程序的151个建议 建议25:不要让四舍五入亏了一方
1700440314
1700440315
本建议还是来重温一个小学数学问题:四舍五入。四舍五入是一种近似精确的计算方法,在Java 5之前,我们一般是通过使用Math.round来获得指定精度的整数或小数的,这种方法使用非常广泛,代码如下:
1700440316
1700440317
public class Client{
1700440318
1700440319
public static void main(String[]args){
1700440320
1700440321
System.out.println(“10.5近似值:”+Math.round(10.5));
1700440322
1700440323
System.out.println(”-10.5近似值:”+Math.round(-10.5));
1700440324
1700440325
}
1700440326
1700440327
}
1700440328
1700440329
输出结果为:
1700440330
1700440331
10.5近似值:11
1700440332
1700440333
-10.5近似值:-10
1700440334
1700440335
这是四舍五入的经典案例,也是初级面试官很乐意选择的考题,绝对值相同的两个数字,近似值为什么就不同了呢?这是由Math.round采用的舍入规则所决定的(采用的是正无穷方向舍入规则,后面会讲解)。我们知道四舍五入是有误差的:其误差值是舍入位的一半。我们以舍入运用最频繁的银行利息计算为例来阐述该问题。
1700440336
1700440337
我们知道银行的盈利渠道主要是利息差,从储户手里收拢资金,然后放贷出去,其间的利息差额便是所获得的利润。对一个银行来说,对付给储户的利息的计算非常频繁,人民银行规定每个季度末月的20日为银行结息日,一年有4次的结息日。
1700440338
1700440339
场景介绍完毕,我们回过头来看四舍五入,小于5的数字被舍去,大于等于5的数字进位后舍去,由于所有位上的数字都是自然计算出来的,按照概率计算可知,被舍入的数字均匀分布在0到9之间,下面以10笔存款利息计算作为模型,以银行家的身份来思考这个算法:
[
上一页 ]
[ :1.70044029e+09 ]
[
下一页 ]