【问题标题】:Trouble printing the value of a Long division and multiplication打印长除法和乘法的值时遇到问题
【发布时间】:2012-06-20 19:07:57
【问题描述】:

我很难弄清楚为什么像这样的简单除法总是返回 0。

System.out.println(4091365376L / 4091495462L * 100L);

我给所有数字加上了 Ls 后缀,所以它们被视为 Longs。我总是得零。

我正在尝试计算 4091365376L 与 4091495462L 的百分比。我的值是 Long,但我只是在寻找一个简单的 Integer 值。

【问题讨论】:

  • 在 Java 中已经有一段时间了,但我认为您需要使用 % 字符来返回“mod”。

标签: java math integer long-integer


【解决方案1】:

您是整数舍入的受害者(实际上是:截断)。试试这个:

System.out.println(4091365376L * 100L / 4091495462L);

打印99。或隐式转换为double

System.out.println(100.0 * 4091365376L / 4091495462L);

99.99682057572328。你的问题是4091495462L4091365376L 略大,所以当潜水它们时,结果被截断为0(如果你不相信,试试3 / 4)。和0100 是...

【讨论】:

    【解决方案2】:

    在整数数学中:

    4091365376 / 4091495462 = 0
    0 * 100 = 0
    

    你期待

    4091365376 / 4091495462 = 0.9999682057572327
    0.9999682057572327 * 100 = 99.99682057572327
    

    但你不能用整数(或长整数)来做到这一点。如果需要双精度值,请使用双精度值。

    【讨论】:

      【解决方案3】:

      顺序很重要,类型也很重要。 long 除以 long 的输出是 long。您执行的除法结果是 0,并且 0 * 100 == 0。使用这样的东西会更好:

      System.out.println((long) (4091365376.0 / 4091495462.0 * 100));
      

      【讨论】:

        【解决方案4】:
        4091365376L / 4091495462L * 100L
        \_______________________/       |
              0.99... = 0               |
              \_________________________/
                            0
        

        你可以这样表达

        100 * 4091365376L / 4091495462L
        

        然后就变成了

        100 * 4091365376L / 4091495462L
        \_______________/              |
          409136537600L                |
          \____________________________/
                  99.99... = 99  
        

        【讨论】:

        • 我喜欢 ASCII 图表。在这些情况下,它真的很容易。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 2014-11-07
        相关资源
        最近更新 更多