Java中使用双精度类型进行除法时出错

Java中使用双精度类型进行除法时出错,java,double,rounding,division,integer-division,Java,Double,Rounding,Division,Integer Division,好的。我已经把头撞在墙上两个小时了,现在我想弄清楚到底为什么double-answer=364/365告诉我答案为0。或者任何其他的双精度的组合。就这一点而言,它只是截断小数点,我只是不知道为什么 364/365执行整数除法(截断小数) 尝试double-answer=364.0/365强制它执行浮点除法 比如: double days_in_year = 365; double answer = 364/days_in_year; 也可以,因为其中一个操作数不是整数。需要进行双除法。现在Ja

好的。我已经把头撞在墙上两个小时了,现在我想弄清楚到底为什么
double-answer=364/365
告诉我
答案
为0。或者任何其他的双精度的组合。就这一点而言,它只是截断小数点,我只是不知道为什么

364/365执行整数除法(截断小数)

尝试
double-answer=364.0/365
强制它执行浮点除法

比如:

double days_in_year = 365;
double answer = 364/days_in_year;

也可以,因为其中一个操作数不是整数。

需要进行双除法。现在Java将其解释为整数除法并返回截断的
int

您需要的是:

double answer = 364 / 365.0;

取一个整数类型(364)除以另一个整数类型(365)-答案将是一个整数,然后存储在双精度答案中。您可以执行以下操作:

double answer = 364d / 365d;
更多信息请点击此处:


原因是java中整数文本的默认类型是
int
,所有基于
int
的算术运算的结果都被类型转换回
int
。因此,尽管您的答案是0.997,但当它被倒排时,它变为0:

(int)0.997  = 0
所以你可以这样做:

364.0/365.0


以上所有答案都是正确的,我只想补充一点,这一切都是关于吉戈的

double answer = 364/365;
在上面的代码中,双精度类型表示只回答变量,算术表达式具有int类型的两个操作数。因此,算术表达式的输出也是int类型,然后通过自动向上转换为double类型,输出为0.0,如下示例所示:

double ans = 4.0/0;
上面的代码将给出输出无穷大,因为其中一个操作数是浮点数,因此通过自动类型转换将0转换为0.0,结果与浮点数据类型一致

鉴于

double ans = 4/0;

将在运行时给出java.lang.arithmetricException:/by zero异常,因为两个操作数都是数据类型int,因此无论ans变量数据类型是否为double,输出均为整数数据类型。

+1用于使用d后缀,这比在末尾添加.0或使用显式强制转换好得多(IMHO),正如所有其他答案所表明的那样。
double ans = 4.0/0;
double ans = 4/0;