Java

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)
上一篇下一篇

猜你喜欢

热点阅读