我有一个循环,每次迭代都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可以是负数。
这是我的输出,只有一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.5(double文字),但差值将缩小int到分配回之前的值decrease。
在JLS,第5.1.3节套这种原始的收缩转换。
从浮点数到整数类型 T 的缩小转换需要两个步骤:
第一步,将浮点数转换为 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应该是浮点类型。
| 归档时间: |
|
| 查看次数: |
668 次 |
| 最近记录: |