5

有人可以向我解释为什么这个输出:

    double y = 15/7;
    DecimalFormat first = new DecimalFormat("#.###");
    System.out.println(y); 
    String format_string = first.format(y);
    System.out.println(format_string);

这是:

   2.0
   2

(这是错的)

但是,当我将 15/7 更改为

 15.0/7.0

它给了我正确的答案

 2.142857142857143
 2.143

请解释一下?

谢谢!

4

6 回答 6

3

代替

double y = 15/7;

double y = 15.0/7;

当除以二int时,你得到一个int.

规格

整数除法向 0 舍入。也就是说,在二进制数值提升(第 5.6.2 节)之后为整数的操作数 n 和 d 产生的商是一个整数值 q,其幅值尽可能大,同时满足 |d · q|。≤ |n|。此外,当 |n| 时 q 为正 ≥ |d| 并且 n 和 d 具有相同的符号,但是当 |n| 时 q 为负 ≥ |d| n 和 d 符号相反。

double通过将其存储在double变量中将其转换为 a ,但为时已晚:您无法恢复丢失的精度。解决方案是让其中一个操作数为双精度,以便在除法时得到双精度。

于 2013-01-20T20:56:18.750 回答
3

没有点的数字是整数,所以 15/7 是整数运算,结果是 2(除法没有余数)。之后它被转换为双精度值,但保持它的值 2(完成操作后的转换)。

带点的数字首先是双精度数,因此 15.0/7.0 是双精度运算并导致您想要的结果(浮点除法)。

于 2013-01-20T20:56:59.750 回答
3

integers除总是导致integer- 这就是你得到22.0格式化后)的原因。

至少一个除法double给你double

在您的情况下15/7,是两个整数的除法,结果是一个整数(不正确的结果)。如果您更改为15/7.0or15.0/715.0/7.0您的结果将是double正确的结果

于 2013-01-20T20:57:07.537 回答
1

15/7 执行整数除法,向下舍入到最接近的整数。

15/7 = 2 + 1/7 -> 四舍五入为 2

将 y 定义为 double 并不重要,除法没有考虑到这一点,因为它使用了 2 个整数文字。

于 2013-01-20T20:57:09.573 回答
1

这是因为15 / 72返回除法运算的整数部分。如果您需要浮点值操作,请执行以下操作15f / 7

于 2013-01-20T20:57:20.060 回答
1

这两个值都是整数,因此它们向下舍入为 7。由于整数除法的结果是整数,因此您需要确保除以双精度数/浮点数,因为这些除法的结果是可以处理小数的双精度数/浮点数部分数字

即使您指定了一个 double 以将除法的结果放入您实际输入的整数中,但除以 double 意味着结果是 double,因此答案包含正确的结果。

于 2013-01-20T20:57:50.637 回答