内部划分:为什么1/3 == 0的结果?

Tof*_*fiq 95 java integer-division

我写的是这段代码:

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

结果是0.为什么这样,我该如何解决这个问题?

Nol*_*rin 133

两个操作数(1和3)是整数,因此使用整数运算(此处除法).将结果变量声明为double只会导致在分割后发生隐式转换.

整数除法当然会将除法的真实结果舍入为零.因此,结果在0.333...这里向下舍入为0.(请注意,处理器实际上并没有进行任何舍入,但你可以这样想.)

另请注意,如果两个操作数(数字)都以浮点数形式给出; 3.0和1.0,或者甚至只是第一个,然后使用浮点运算,给你0.333....

  • 它向"向零"舍入,对于大于零的值,它向下"向下".(+0.9四舍五入为0,-0.9也四舍五入为0.) (33认同)
  • +1并且它总是向下舍入.`int i = .99999999`将int设置为0.更具体地说,它取整数部分并丢弃其余部分. (31认同)
  • 不,不舍入:[截断](https://en.wikipedia.org/wiki/Truncation?wprov=sfsi1) (14认同)
  • @BasilBourque在java术语中,[舍入`DOWN`](https://docs.oracle.com/javase/8/docs/api/java/math/RoundingMode.html#enum.constant.summary)为零.圆形"FLOOR"朝向负无穷大. (3认同)

Adr*_*ith 22

1/3 使用整数除法,因为两边都是整数.

你至少需要其中一个float或者double.

如果您在源代码中输入值,就像您的问题一样,您可以这样做1.0/3; 这1.0是双重的.

如果从其他地方获得值,您可以使用(double)将其int转换为a double.

int x = ...;
int y = ...;
double value = ((double) x) / y;
Run Code Online (Sandbox Code Playgroud)


小智 10

明确地把它作为一个 double

double g = 1.0/3.0
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为Java使用整数除法运算1,3因为您将它们作为整数常量输入.