Java中使用double进行除法时出现奇怪的行为

17

当我在Java中使用双精度除法将317除以219时,得到的结果为1。
例如:

double b = 317/219;
System.out.println(b);

输出结果为:1。

这是因为它是一个循环小数吗? 不得不使用BigDecimal,这很烦人。


输出将更加精确为1.0 - Ajay Gupta
可能是Java整数除法:如何生成double?的重复问题。我已经做出了我的选择,但这个问题在SO上被问得太多了。 - demongolem
7个回答

29

试一试

 double b = 317/219D;
Java中编码数字的默认类型是int,所以根据您的代码,Java正在处理两个int数字,除法的结果也将是int类型。由于这是一个宽化转换(源类型保证“适合”目标类型),因此将该int 1结果从int强制转换为double 1不会触发编译器警告。

通过将其中任一数字编码为带有尾随Ddouble(也可以使用d,但我总是使用大写字母,因为小写字母L看起来像1),除法的结果也将是double


1
大多数其他答案只是在末尾加上".0"强制使用浮点(双精度)算法,但是这个答案明确指出两个操作数都是双精度类型; 这是一个微妙但重要的点! - Anders R. Bystrup
我确信我已经尝试将其转换为双精度浮点数了!我想我只是有些愚蠢。感谢您的帮助! - Joe
1
@Joe 你需要显式地将除法运算符的其中一个输入转换为double类型 -- 赋值时隐式转换等同于(double) (317 / 219),但是当它像这样被写出来时,显然不会达到你想要的效果。如果你使用(double)a/b,那么就可以得到你想要的结果(转换具有比除法更高的优先级,所以它被解释为((double)a)/b,在某些语言中不是这种情况)。 - anon

7

Another alternative...

double b = (double)317/219;

3
这是因为你使用了整数字面量,所以进行的是整数除法。
尝试写成double b = 317.0/219.0;

2
值得一提的是,在您的例子中,运行时没有除法。317/219在编译时计算(整数除法,小数部分被舍弃)并被替换为常量。如果您反编译.class文件(我使用了Jad http://www.kpdus.com/jad.html),您会看到这一点。
double b = 1.0D;

0

这是一个关于 int 类型的除法。请写出:

double b = 317.0/219;
System.out.println(b);

0

由于您输入的数字是整数,因此答案也是整数。
要获得双精度浮点数,您需要使用带有浮点数的数字或将您使用的整数之一强制转换为浮点数:

double b = 317.0/219;
System.out.println(b);

或者:

double b = ((double)317)/219;
System.out.println(b);

-3

你可以尝试一下

double b = 0.0;
b = 317/219;

这样我就可以返回小数点。


1
这不是正确的答案。由于317和219都是整数,因此无论参数类型如何,结果都将是除法的整数部分。 - zohar
除了上面提到的,还有很多其他尝试的方法。然而@Joe一直在困扰于理解Java中算术运算的工作原理。这根本不应该是一个答案。 - retromuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接