【问题标题】:How to divide two long variables in java [duplicate]如何在java中划分两个长变量[重复]
【发布时间】:2014-08-30 07:30:50
【问题描述】:

对不起,这个基本问题, 我必须将 long 变量除以另一个 long 变量,但它返回 0。 谁能帮忙

long a = 3004230;
long b =  6793368;
long c = (a/b)*100;

【问题讨论】:

  • long c = (long)((a/(float)b)*100);
  • 你在提问之前搜索过你的问题吗? stackoverflow.com/questions/18117014/…stackoverflow.com/questions/6766120/… 或很多老问题
  • 如果您不需要十进制值,请使用long c = (a*100L/b)long c = (a/b)*100 被评估为(a/b)*100 --> (3004230/6793368)*100 --> (0L)*100 --> c=0,因此它将始终为零,而(a*100L/b) --> (300423000/6793368) --> (44L) --> c=44
  • 长 c = 100L *a/b

标签: java variables types casting


【解决方案1】:

文字值和文字算术

该代码存在几个问题。首先,非浮点文字值默认是int类型,所以你的代码中的3004230int。要显式声明它为long,请改用3004230L

此外,所有使用非浮点 literals 完成的算术运算都会返回 int 结果,除非其中一个变量专门转换为浮点类型,例如 floatdouble。因此(a/b)*100 小于 1,因此truncated 降至 0(浮点值刚刚被截断)。此外,即使它确实返回了相同的结果,您也试图将其存储在不能存储浮点值的 long 中。

因此,您应该执行以下操作以获得真正的结果。

long a = 3004230L; // Use the L notation to declare this literal a long.
long b = 6793368L;
double c = ((double)a/b)*100; /* casting one of the variables to (double) means the result will not be 0 */

我希望这会有所帮助。

【讨论】:

  • 数字的小数部分被截断为0,不向下取整。将 0.4 转换为 int 将为 0,将 0.99999999999 转换为 int 也将为 0。小数部分被删除,仅保留整数部分。
  • @DanTemple - 好点,将纠正我的答案。
  • 评论中还有一个错误的说法:“将你的除法结果转换为(双)意味着结果不会为0”。如果您尝试转换结果为时已晚,因为“((双)(a / b))* 100 == 0.0”。代码仍然是正确的,因为您实际上是在将“a”转换为 double 并且它会导致预期的结果:)
  • @MarekManduch 非常正确。我已经更正了。
  • 你不需要 3004230L 中的 L 部分,只要字面值在 int 的大小范围内,它会自动将它从 int 转换为 long :)
【解决方案2】:
final long a = 3004230;
final long b = 6793368;
final double c = ((double) a / b) * 100;

=> c = 44.22298335670907

【讨论】:

    【解决方案3】:

    你现在正在做的是整数除法。这将始终返回整数/长结果。您必须使用 float 或 double 才能获得浮点结果,即使您之后将其转换回整数值。

    long c = (long)(a/(float)b*100);
    

    【讨论】:

      【解决方案4】:

      试试看。

      long a = 3004230;
      long b =  6793368;
      long c = ((long)((float)a/(float)b)*100); //answer=44
      float c = ((long)((float)a/(float)b)*100); //answer=44.1256378
      

      【讨论】:

        【解决方案5】:

        您创建的长 c 不是您期望的值。它在整数范围内。要创建 long,请使用

        最终长 c= 3004230L * 6793368L; 通过在数字文字后添加 L,您可以告诉编译器将其编译为 long 而不是 int。

        【讨论】:

          【解决方案6】:

          显然上面的答案是0..正如你在划分时看到的那样

          3004230 / 6793368 = 0.442 = 0(当转换为 long 类型时)

          0 * 任意数 = 0..

          用这个来转换它

          double c = (a * 1.0/b)*100.0;
          

          您必须使用可以存储 decimal 值的数据类型,即 floatdouble..long 不能存储十进制数字

          【讨论】:

          • 太棒了!!,感谢您的基础知识
          【解决方案7】:

          您可以在不强制转换为 float 的情况下执行相同操作:

          long a =  3004230L;
          long b =  6793368L;
          long c = (a * 100L)/b;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-11
            • 1970-01-01
            • 2015-06-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多