整数除法:为什么1/3的结果是0?

152

我正在编写这段代码:

public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}
结果为0。为什么会这样,我该如何解决这个问题?

已经有很多关于这个问题的讨论了,但是在这里你可以阅读更多相关内容的来源:https://feb21011.ese.eur.nl/week-1/6-calculating(舍入的段落)。 - Marja van der Wind
19个回答

1

1和3是整数常量,因此Java进行整数除法,其结果为0。如果您想编写双精度常量,则必须编写1.03.0


0

由于它将1和3视为整数,因此将结果向下舍入为0,使其成为整数。

要获得您要查找的结果,请明确告诉Java这些数字是双精度,如下所示:

double g = 1.0/3.0;

0
public static void main(String[] args) {
    double g = 1 / 3;
    System.out.printf("%.2f", g);
}

由于1和3都是整数,所以结果不是四舍五入而是截断。 因此,您忽略小数部分并仅取整数部分。

为避免这种情况,请将您的数字中至少有一个设置为十进制形式1.0和/或3.0。


0
我注意到在许多回复中没有提到,但您也可以执行1.0 * 1 / 3以获得浮点除法。当您有无法在其后添加.0的变量时,这更加有用,例如:
import java.io.*;

public class Main {
    public static void main(String[] args) {
        int x = 10;
        int y = 15;
        System.out.println(1.0 * x / y);
    }
}

0

(1/3) 表示整数除法,因此您无法从此除法获得小数值。 要解决此问题,请使用:

public static void main(String[] args) {
        double g = 1.0 / 3;
        System.out.printf("%.2f", g);
    }

-1

我的代码是:

System.out.println("enter weight: ");
int weight = myObj.nextInt();

System.out.println("enter height: ");
int height = myObj.nextInt();

double BMI = weight / (height *height)
System.out.println("BMI is: " + BMI);

如果用户输入体重(分子)= 5,身高(分母)= 7, 当分母>分子时,BMI为0,并返回整数(5/7 = 0.71),因此结果为0(不带小数值)。 解决方案: 选项1:
doubleouble  BMI = (double) weight / ((double)height * (double)height);

选项2:

double  BMI = (double) weight / (height * height);

-1

试一下这个:

public static void main(String[] args) {
    double a = 1.0;
    double b = 3.0;
    double g = a / b;
    System.out.printf(""+ g);
}

1
请不要发布仅包含代码的答案,需要解释您的代码是如何解决问题的,以及为什么这样做。同时,请考虑到这是一个8年前的问题,已经有了得到赞同的答案,您的回答是否能够为现有答案增加价值。 - Mark Rotteveel

-1
请使用“double g=1.0/3.0;”代替。

只是好奇...这个答案有什么问题吗?我在第一次遇到这个问题时使用了这种方法。如果能解释一下这个解决方案的问题,我会很感激。提前谢谢。 - Mr. Port St Joe
@Mr.PortStJoe 这并没有向提问者提供任何详细信息。从最受欢迎的答案来看,我们可以看到他们也解释了为什么会发生这种情况。虽然答案在技术上可能是正确的,但它的实用性可能被视为有限。 - Andrew T Finnell

-2

许多人都没有指出真正的问题:

仅对整数进行操作会将操作结果转换为整数。

这必然意味着浮点数结果,即使可以显示为整数,也将被截断(去掉小数部分)。

你问什么是类型转换

它因语言实现而异,但维基百科有一个相当全面的视角,并且它也谈到了强制转换,这是回答你的问题的关键信息。

http://en.wikipedia.org/wiki/Type_conversion


这个答案是有缺陷的。在一个全整数除法中,比如 1/2,并没有涉及到类型转换或类型转化,至少在目标语言(Java)中是这样的。你只需要调用一个整数除法,结果将会是一个整数。类型转换只是因为在赋值过程中从 int 转换成了 double - YoYo
@YoYo 你在说0.5是整数吗?我不这么认为,朋友。 - sova
2
这位同志没有提到 0.5。在Java中,1/2是一个整数除法,结果为零整数。你可以将零赋值给double,它仍然是零,尽管是一个0.0的double。 - YoYo

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