【问题标题】:Java Modulus with Double [duplicate]带双精度的 Java 模数 [重复]
【发布时间】:2015-02-03 06:21:59
【问题描述】:

所以我正在使用一些模数,我很困惑为什么我这样做

 .3%.1  

我明白了

0.09999999999999998 

而不是 0... 我该如何解决这个问题?

【问题讨论】:

  • 0.3 和 0.1 都不能用 float 或 double 表示
  • 看不到您的代码,我们无能为力。

标签: java double modulus


【解决方案1】:

考虑BigDecimal

不可变的、任意精度的有符号十进制数。

这可以准确表示您的值。 floating point values is because they aren't exact 不起作用(如您所料)的原因。

所以使用 BigDecimal API,

BigDecimal n1 = new BigDecimal("0.3");
BigDecimal n2 = new BigDecimal("0.1");
BigDecimal r = n1.remainder(n2);
System.out.println(r);

输出:

0.0

【讨论】:

    【解决方案2】:

    最接近 0.03 的双倍是 0.0299999999999999988897769753748434595763683319091796875 和最接近 0.01 的双倍是 0.010000000000000000208166817117397651328808073976513288050>

    将略小于 0.03 的值以略大于 0.01 的模数减少一定会导致值略小于 0.01。

    不具有精确浮点表示的数字同样可能由稍小或稍大的东西表示。这适用于四舍五入,但可能会导致不方便的结果与地板、天花板和类似运算,包括模数,其中具有微小差异的值的处理方式非常不同。

    如前所述,如果精确处理小数部分特别重要,请使用 BigDecimal 或按 10 的幂进行缩放并进行整数运算。否则,请提供有关模运算的上下文和原因的更多信息。

    【讨论】:

      【解决方案3】:

      你可以试试这个-:

        System.out.println((int)(.3%.1));
      

      这会将o/p 打印为0

      原因是因为你在做浮点运算,结果是一个浮点数。

      【讨论】:

      • 这不能回答问题。 OP想要浮点模数。像您一样将其转换为 int ,结果将不再正确。 2.0 % 1.1 = 0.9 但转换为 int 将导致 0 远非正确
      • 此外,在这种情况下,它只是幸运的 0。除以 0.1 的余数总是小于 0.1,这在转换为 int 时为 0。因此结果始终为 0,模数没有意义。与任何小于 1 的数相同
      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2012-05-07
      • 2017-08-28
      相关资源
      最近更新 更多