一旦 int 为零,迭代地从 int 中减去 double (0.5) 就什么都不做。

Mat*_*Mat 2 java loops

我有一个循环,每次迭代都double从 an 中减去(0.5) int,它工作得很好,直到int命中 0。为什么值不低于 0?

这是我的代码示例:

int decrease = 2

for(int i = 0; i < 6; i++){
    System.out.println(decrease);
    decrease -= 0.5;
}
Run Code Online (Sandbox Code Playgroud)

输出:

int decrease = 2

for(int i = 0; i < 6; i++){
    System.out.println(decrease);
    decrease -= 0.5;
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我一些替代方案,或者我做错了什么?因为我真的需要一个整数来减少小于 1 并且我知道 anint可以是负数。

rge*_*man 5

这是我的输出,只有一2和一1

2
1
0
0
0
0
0
0
Run Code Online (Sandbox Code Playgroud)

复合赋值运算符-=就是一个例子,它将它们的结果转换回左侧的变量类型。在JLS,第15.26.2,状态:

形式为 E1 op= E2 的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,只是 E1 只计算一次。

这意味着对于实际的减法, 的值decrease将被提升为double减法0.5double文字),但差值将缩小int到分配回之前的值decrease

JLS,第5.1.3节套这种原始的收缩转换。

从浮点数到整数类型 T 的缩小转换需要两个步骤:

  1. 第一步,将浮点数转换为 long(如果 T 是 long)或转换为 int(如果 T 是 byte、short、char 或 int),如下所示:

    • 如果浮点数为 NaN(第 4.2.3 节),则转换的第一步的结果是 int 或 long 0。

    • 否则,如果浮点数不是无穷大,浮点值将被舍入为整数值 V,使用 IEEE 754向零舍入模式(第 4.2.3 节)向零舍入。...

(强调我的)

第一次减法产生1.5,向 0 舍入到1。第二次减法产生0.5,向 0 舍入到0。任何后续减法产生-0.5,它向 0 四舍五入,回到0

为了避免这种行为,decrease应该是浮点类型。