Java中的十进制格式?

时间:2013-01-20 20:55:06

标签: java

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

    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

请说明?

谢谢!

6 个答案:

答案 0 :(得分:3)

替换

double y = 15/7;

double y = 15.0/7;

在划分两个int时,您会获得int

请参阅specification

  

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

通过将其存储在double变量中将其转换为double,但为时已晚:您无法获得丢失的精度。解决方案是让其中一个操作数为双精度数,这样你在分割时得到一个双倍。

答案 1 :(得分:3)

没有点的数字是整数,因此15/7是整数运算,结果是2(没有余数的除数)。之后它会转换为double,但是它的值为2(完成操作后的转换)。

带点的数字首先是双倍的,所以15.0 / 7.0是双重操作,导致你想要的结果(浮点除法)。

答案 2 :(得分:3)

两个integers的分区始终会生成integer - 这就是您在格式化后获得22.0)的原因。

至少一个double的分部为您提供double

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

答案 3 :(得分:1)

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

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

将y定义为double是没关系的,因为它使用了2个整数文字,所以除法没有考虑到这一点。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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