在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;
这样我就可以返回小数点