【问题标题】:Invalid result when multiplying negative Duration value by a negative integer将负 Duration 值乘以负整数时结果无效
【发布时间】:2014-12-29 01:16:27
【问题描述】:
Duration.ofSeconds(-4, 333333333).multipliedBy(-2)

它返回PT7.333333334S,我预计结果是PT8.666666666S

这似乎是可取的,因为它有测试用例: http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/test/java/time/tck/java/time/TCKDuration.java#l2151

我看不出这部分发生在代码的什么地方:

public Duration multipliedBy(long multiplicand) {
    if (multiplicand == 0) {
        return ZERO;
    }
    if (multiplicand == 1) {
        return this;
    }
    return create(toSeconds().multiply(BigDecimal.valueOf(multiplicand)));
 }

private static Duration create(BigDecimal seconds) {
    BigInteger nanos = seconds.movePointRight(9).toBigIntegerExact();
    BigInteger[] divRem = nanos.divideAndRemainder(BI_NANOS_PER_SECOND);
    if (divRem[0].bitLength() > 63) {
        throw new ArithmeticException("Exceeds capacity of Duration: " + nanos);
    }
    return ofSeconds(divRem[0].longValue(), divRem[1].intValue());
}

private BigDecimal toSeconds() {
    return BigDecimal.valueOf(seconds).add(BigDecimal.valueOf(nanos, 9));
}

您能解释一下这是什么/为什么会发生吗?

【问题讨论】:

  • 如果您不同意编辑,请随时重新编辑或回滚。我只是认为在正文中使用描述性标题和代码会比其他方式更具可读性。

标签: datetime java-8 duration


【解决方案1】:

第二个参数是调整而不是小数部分。

Duration.ofSeconds(-4, 333333333) 不是-4.333333333 s
相反,它应该读作-4 s + 333333333 ns,它与-3.666666667 s 相同。

要获得8.666666666 s 作为结果,您需要使用
Duration.ofSeconds(-4, -333333333).multipliedBy(2)


它发生在计算秒和纳秒值之和的toSeconds 方法中:

private BigDecimal toSeconds() {
    return BigDecimal.valueOf(seconds).add(BigDecimal.valueOf(nanos, 9));
}

【讨论】:

  • 好的,知道了,但是您能解释一下代码中发生这种情况的地方吗?我更新了我的问题以获取更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 2012-02-15
  • 2013-05-10
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多