in ratis-common/src/main/java/org/apache/ratis/util/TimeDuration.java [244:272]
public TimeDuration multiply(double multiplier) {
final double product = duration * multiplier;
final long rounded = Math.round(product);
if (unit.ordinal() != TimeUnit.values().length - 1) {
// check overflow error
if (rounded == Long.MAX_VALUE || rounded == Long.MIN_VALUE) {
if (Math.abs(multiplier) > 2) {
return multiply(2).multiply(multiplier / 2);
} else {
return to(higherUnit(unit)).multiply(multiplier);
}
}
}
if (unit.ordinal() != 0) {
// check round off error
if (Math.abs(product - rounded) > Math.abs(product) * ERROR_THRESHOLD) {
if (isMagnitudeLarge(duration) && Math.abs(multiplier) < 0.5d) {
return multiply(0.5).multiply(multiplier * 2);
} else {
return to(lowerUnit(unit)).multiply(multiplier);
}
}
}
final TimeDuration t = valueOf(rounded, unit);
LOG.debug("{} * {} = {}", this, multiplier, t);
return t;
}