初学Java问题(int,float)

6
int cinema,dvd,pc,total;
double fractionCinema, fractionOther;
fractionCinema=(cinema/total)*100; //percent cinema

当我运行代码以显示fractionCinema时,它只给我零。如果我将所有的int改为double,那么它会给我我想要的结果。然而,我在其他地方使用cinema、pc和total,并且它们必须作为整数而不是小数显示。我该怎么办?


请参阅Java整数除法,如何产生 double? - Matthew Flaschen
根据丰富的经验,小心挑剔:当实际上应该称为"percentCinema"时,不要将其称为"fractionCinema"。一年后的支持工作就会变得非常混乱! - user949300
4个回答

16

当你除以两个整数时(例如,2/3),Java会执行整数除法并截断小数部分。
因此,2/3==0

你需要通过将任一操作数强制转换为double来让Java执行double除法。

例如:

fractionCinema = (cinema / (double)total) * 100;

没有必要使用浮点运算,尤其是因为OP表示最终显示不需要。请参见我的回答以获得仅限整数的解决方案。 - David R Tribble

5
尝试使用这个替代方案:
int  cinema, total;
int  fractionCinema;

fractionCinema = cinema*100 / total;   //percent cinema

例如,如果 cinema/(double)total 是 0.5,那么 fractionCinema 就是 50。而且不需要使用浮点运算;所有的计算都使用整数算术完成。 补充说明 正如 @user949300 指出的那样,上面的代码向下舍入到最接近的整数。要“正确地”四舍五入结果,请使用以下代码:
fractionCinema = (cinema*100 + 50) / total;    //percent cinema

假设 OP 只想要整数值,那么这就是最佳答案。("我在其他地方使用电影院、电脑和总计,它们必须以整数形式显示,而不是小数。") - qben
这个编程方面的小缺点是结果总是向下取整。在我看来,浮点数解决方案更好,因为它会采用“正常”的舍入方式。另外,挑剔一点的话,“fractionCinema”应该被命名为“percentCinema”。 - user949300

2

当你将两个 int 数字相除时,Java 会进行整数除法,小数部分将被截断。

你可以通过显式地将其中一个参数转换为 double 类型,例如 cinema/(double) total 或者隐式地使用操作符,例如 cinema*1.0/total


2
在我看来,第二个例子 *1.0 只是为了强制转换类型为 double 而进行的乘法运算,这是一种代码异味。最好编写能够澄清你意图的代码。你的意图是“需要将其转换为 double 类型”。使用 (double) -- 这就是它的作用。原因是:其他人可能会轻易地看到一个乘以 1.0 的乘法运算,并认为“这是一个浪费的乘法运算,我要将其删除”。你可以在代码行中添加注释:// "*1.0" is to convert to double。但是,当所需的运算符已经存在时,这样做是愚蠢的。 - ToolmakerSteve

0

正如一些人已经指出的那样,当对整数进行除法运算时,Java会自动截断任何小数部分。只需将变量从int更改为double即可。


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