0<1/3为false
2020-08-27 本文已影响0人
王勇1024
背景
近期实现了一个小功能:通过rsync同步文件到多个服务器,如果同步失败机器数量不小于机器总量的1/3,就认为此次任务失败,不更新同步进度。我的写法是
rsyncFailedHosts.size() < (hosts.size() / 3)
初看没有问题,测试时也没发现问题。上线一段时间后却发现有部分任务文件同步进度不能正常更新。排查后发现这些任务都有一个共同的特定:服务器数量少于3台。
于是心中已基本确定是因为Java 两个整数相除,结果只会保留整数部分,而当分子小于分母时,结果的整数部分是0,0 < 0结果必然为false
。
于是写了一个简单的单元测试进行了验证:
@Test
public void divide() {
System.out.println(1/3);
System.out.println(0 < (1/3));
}
--------------------------
输出结果:
0
false
--------------------------
这是一个在工作中比较常见的错误,一定要避免再次出错!!!
解决方案
把分母从整数改成浮点数即可:
rsyncFailedHosts.size() < (hosts.size() / 3.0)