在Java中分割双精度时的奇怪行为

当我使用双打在Java中将317除以219时,我得到1。
例如:

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

输出为:1。

这是因为它是一个重复的小数? 不得不使用BigDecimal,这很烦人。

尝试这个

  double b = 317/219D; 

java中的默认编码数字类型是int ,所以使用代码就可以了,java使用两个int数,然后除法的结果也是int ,这会截断小数部分,得到最终结果1 。 然后,这个int结果从int 1转换为double 1而没有编译器警告,因为它是一个扩展的转换 (一个源类型保证“适合”到目标类型)。

通过将尾数D任何一个数字编码为double (您也可以使用d ,但我总是使用大写字母,因为L作为小写l看起来像1 ),除法的结果也将是double

另一种选择……

 double b = (double)317/219; 

这是因为您使用了整数文字,因此您正在进行整数除法。

尝试写double b = 317.0/219.0; 代替。

值得一提的是,您的示例在运行时没有划分。 317/219在编译时计算(整数除法,分数被丢弃)并用常量替换。 如果你反编译.class(我使用Jad http://www.kpdus.com/jad.html ),你会看到

 double b = 1.0D; 

这是分开的。 写:

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

因为你输的数字是不合理的,所以答案也是如此。
要获得双倍,您需要使用带浮点数的数字或者使用您使用的整数之一:

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

要么:

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

你可以试试

 double b = 0.0; b = 317/219; 

这样我就可以返回小数点