【问题标题】:Java integer-double division confusion [duplicate]Java整数双除法混淆[重复]
【发布时间】:2023-03-28 12:00:01
【问题描述】:

计划 1

int sum = 30;  
double avg = sum / 4; // result is 7.0, not 7.5 !!!

VS.

方案 2

int sum= 30   
double avg =sum/4.0 // Prints lns 7.5

这是因为程序 1 中的 '4' 是一个字面整数吗?所以 30/4 会给我 7。但是,由于这种数据类型是双精度的,所以我们需要添加一个 .0 来结束。所以'7.0'

程序 2 有 4.0,它充当文字双精度。 int/double 总是会给出 double ,因为它更精确。所以我们得到'7.5'。我不明白 double 数据类型对结果做了什么......它真的不需要做任何事情,因为 double 数据类型的条件已经满足。(从计算中得到最精确的结果)。

我错了吗?我鼓励你纠正我!这就是我学习的方式.. :)

【问题讨论】:

  • 您的标题表明混淆是围绕println 的行为,而在我看来问题实际上与除法运算符有关。
  • it really doesn't need to do anything since the conditions of the double data type are already satisfied. ??这是什么意思?
  • @JonSkeet 看来,他的问题是why the result is getting printed like that :)

标签: java


【解决方案1】:

在你的第一个例子中:

int sum = 30;
double avg = sum / 4; // result is 7.0, not 7.5 !!!

sum 是一个 int,4 也是一个 int。 Java 将一个整数除以另一个整数并得到一个整数结果。这一切都发生在 将值分配给 double avg 之前,到那时您已经丢失了小数点右侧的所有信息。

尝试一些投射。

int sum = 30;
double avg = (double) sum / 4; // result is 7.5

int sum = 30;
double avg = sum / 4.0d; // result is 7.5

【讨论】:

    【解决方案2】:

    这是一个整数除法(因为它涉及到两个整数)

    int sum = 30;  
    double avg = (sum / 4); // result is 7
    

    整数除法,四舍五入到最接近的整数。

    不过,这是双除法(因为 4.0 是双除法)

    int sum= 30   
    double avg = (sum/4.0) //  result is 7.5
    

    这是预期的行为,并且转换都是明确定义的。无需猜测。看看java docs关于转化。

    将 int 或 long 值转换为 float 或 long 值加倍,可能会导致精度损失——即结果 可能会丢失该值的一些最低有效位。在这 在这种情况下,生成的浮点值将是正确舍入的 整数值的版本,使用 IEEE 754 舍入到最近模式

    【讨论】:

      【解决方案3】:

      在 java 中,涉及仅整数类型(int、long 等)的操作具有整数结果。这包括部门。

      30 和 4 都是整数值,因此如果您尝试将它们相除,则使用 整数 除法。

      但如果您尝试30.0/430/4.0,则结果将是7.5,因为您将使用浮点除法。

      变量avg的声明类型对结果没有影响。小数部分在除法期间丢失,而不是在将值分配给变量时丢失。

      【讨论】:

      • 如果我用Java写,比如说,3.0,它不会被认为是双重的吗?如果我想要 3.0 的浮点类型,我会写 3.0f。对吗?
      • 是的,没错。 Double 是一种浮点类型(名称 double 代表双精度浮点)。 3.0 是双精度常数,3.0f 是浮点常数。
      【解决方案4】:

      图片取自:http://www.mathcs.emory.edu/~cheung/Courses/170/Syllabus/04/mixed.html

      请参阅上面的 URL 以获得更清晰的说明。

      【讨论】:

        【解决方案5】:

        程序 1 在 Java 中,当您在两个整数之间进行除法时,结果是一个整数。所以当你做 sum/4 时,结果是整数 7。然后你把这个整数赋给一个 double 变量,这样 7 就变成了 7.0。

        程序 2 在 Java 中,当您在整数和双精度之间进行除法时,结果是双精度。所以当你做 sum/4.0 时,结果是双 7.5。然后你把它赋值给一个双变量,所以它仍然是 7.5。

        所以问题不在于 println 如何打印变量,而在于 Java 中除法的工作原理

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-09
          • 2016-03-19
          • 2016-04-02
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多