【问题标题】:Division of integers in Java [duplicate]Java中的整数除法[重复]
【发布时间】:2023-04-02 11:15:02
【问题描述】:

这是一个基本问题,但我找不到答案。我研究了浮点算术和其他一些主题,但似乎没有任何东西可以解决这个问题。我确定我只是用了错误的术语。

基本上,我想取两个数量 - 已完成和总计 - 并将它们除以得出一个百分比(已完成的数量)。数量为longs。这是设置:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

我尝试将结果重新分配给双精度 - 它打印 0.0。我哪里错了?

顺便说一句,下一步是将这个结果乘以 100,我认为一旦跨过这个小障碍应该很容易。

顺便说一句,这里不是家庭作业,只是简单的旧 numskull-ness(今天可能编码太多)。

【问题讨论】:

  • 您是否尝试过 (double)completed / (double) total ... 然后将结果分配给 double?

标签: java math floating-point long-integer println


【解决方案1】:

转换输出为时已晚;计算已经在整数算术中进行。您需要将 inputs 转换为 double:

System.out.println((double)completed/(double)total);

请注意,您实际上并不需要转换两个的输入。只要其中一个是double,另一个就会被隐式转换。但为了对称,我更喜欢两者都做。

【讨论】:

  • java中是否有任何关键字来划分两个数字,例如'Math.floorDiv(num1,num2)'
  • @Rudra - 我不确定你在问什么。如果num1num2 是正整数,那么num1 / num2 会给你你想要的。否则,它只是Math.floor(num1 / num2)
【解决方案2】:

你甚至不需要双打。只需先乘以 100 ,然后再除。否则结果将小于 1 并被截断为零,如您所见。

编辑:或者如果可能溢出,如果它会溢出(即被除数大于 922337203685477581),首先将除数除以 100。

【讨论】:

  • 明确一点:结果会rounded 还是floored 为零?大不同。
  • 使用双重打印类似 20.0,使用上述方法打印纯 20。就我而言,这是最好和最简单的解决方案。
【解决方案3】:
In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

只需键入 cast 中的任何一个即可。

【讨论】:

    【解决方案4】:

    在进行分解时将completedtotal 都转换为double 或至少将它们转换为double。 IE。将变量转换为双倍而不仅仅是结果。

    公平警告,使用 floatdouble 时会出现 floating point precision problem

    【讨论】:

      【解决方案5】:

      如果您在进行除法之前没有将两个值之一显式转换为浮点数,则将使用整数除法(这就是您得到 0 的原因)。只需将两个操作数之一设为浮点值,即可正常除法(其他整数值自动转为浮点数)。

      试试看

      float completed = 50000.0f;
      

      会好的。

      【讨论】:

        【解决方案6】:

        正如JLS 所解释的,整数运算非常简单。

        如果除移位运算符以外的整数运算符至少有一个 long 类型的操作数,则使用 64 位精度执行运算,数值运算符的结果为 long 类型。如果另一个操作数不长,则首先将其扩展(第 5.1.5 节)以通过数字提升(第 5.6 节)键入 long。

        否则使用32位精度进行运算,数值运算符的结果为int类型。如果任一操作数不是 int,则首先通过数字提升将其扩展为 int 类型。

        所以简而言之,一个操作总是会产生一个int,唯一的例外是其中有一个long 值。

        int = int + int
        long = int + long
        int = short + short
        

        注意运算符的优先级很重要,所以如果你有

        long = int * int + long
        

        int * int 操作会产生一个int,它会在操作int + long 期间提升为一个long

        【讨论】:

          【解决方案7】:

          由于您的输出结果是双倍,您应该在除法时将完成变量或总变量或两者都转换为双倍。

          所以,正确的实现是:

          System.out.println((double)completed/total);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            • 2013-10-30
            • 2019-06-20
            • 1970-01-01
            • 2013-02-16
            相关资源
            最近更新 更多