java - 升级和比较

标签 java casting floating-point

我似乎找不到以下代码中断的原因:

从我的角度来看,整数 lbnd 减少了

public class Test {
    public static void main(String[] args) {
        methode1();
    }
    static void methode1() {
        int ubnd = Integer.MAX_VALUE;
        int lbnd = ubnd;

        while ((float)lbnd == (float)ubnd) {
            --lbnd;
        }   
        System.out.println((++lbnd) + ".." + ubnd);
    }
}

问题是,从我所看到的来看,这个循环应该是一个无限循环,但是它在 64 个循环后中断,因为整数的值发生了变化。结果是:

2147483584..2147483647

但它应该是一个无限循环:

2147483647..2147483647

最佳答案

请记住, float 没有足够的精度来精确存储整数的所有 32 位。因此,对于高量级整数,出于浮点比较的目的,(float) i 和 (float) (i-1) 是相同的。

(顺便说一句,当比较 int 和 float 时,它将被视为 float 比较。因此,为了说明一个额外的陷阱,您甚至不需要将强制转换浮在 == 比较的一侧。)

关于java - 升级和比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13444891/

相关文章:

c - %g printf 说明符到底是什么意思?

javascript - Javascript 中的单精度 float 仿真 (float32)

java单例与双重检查

java - JAX-WS 编码错误。 SomeClassV1R5 无法转换为 SomeClass 的目标类型

java - 保存SQL数据库条目的创建日期

c++ - 类型转换为整数

delphi - 测试强制转换 OleVariant 是否会引发异常(不引发异常)

java - 从任何字符串中获取最后三个字符 - Java

java - OpenSaml 检索错误的 RoleDescriptor 对象

c++ - C - 打印浮点值