当前位置: 首页 > 面试题库 >

为什么在Java中比较浮点数不一致?

马正初
2023-03-14
问题内容
class Test{  
    public static void main(String[] args){  
        float f1=3.2f;  
        float f2=6.5f;

        if(f1==3.2){
            System.out.println("same");  
        }else{
            System.out.println("different");  
        }
        if(f2==6.5){
            System.out.println("same");  
        }else{  
            System.out.println("different");  
        }
    }  
}

输出:

different
same

为什么这样的输出?我期望same作为第一种情况的结果。


问题答案:

区别在于6.5可以完全以float和double表示,而3.2不能完全以两种类型表示。并且两个最接近的近似是不同的。

float和double之间的相等比较首先将float转换为double,然后将两者进行比较。因此数据丢失。

您不应该比较浮点数或双精度数是否相等。因为您不能真正保证分配给float或double的数字是准确的。

该舍入误差是浮点计算的特征

将无限多个实数压缩为有限数量的位需要近似表示。尽管有无限多个整数,但是在大多数程序中,整数计算的结果可以存储在32位中。

相反,在给定固定位数的情况下,大多数使用实数的计算将产生无法使用那么多位数精确表示的数量。因此,浮点计算的结果通常必须四舍五入,以重新适合其有限表示形式。舍入误差是浮点计算的特征。

检查每个计算机科学家应该了解的有关浮点运算的更多信息!



 类似资料:
  • 问题内容: 根据此java.sun页面,它 是Java中浮点数的相等比较运算符。 但是,当我键入以下代码时: 进入我的编辑器并运行静态分析,我得到:“ JAVA0078浮点值与==”进行比较 什么是错的使用比较浮点值?正确的方法是什么? 问题答案: 测试浮标“相等”的正确方法是: 其中epsilon是非常小的数字,例如0.00000001,具体取决于所需的精度。

  • 问题内容: 我想比较PHP中的两个浮点数,如以下示例代码所示: 在此代码中,即使和相同,它也返回条件的结果而不是条件。有没有什么特殊的方法来处理/比较PHP中的浮点数? 如果是,那么请帮助我解决此问题。 还是我的服务器配置有问题? 问题答案: 如果您这样做,它们 应该 是相同的。但是请注意,浮点值的一个特征是 看起来 可以导致相同值的计算实际上不必相同。因此,如果是一个文字并通过计算到达该文字,则

  • 本文向大家介绍在C / C ++中为浮点数和比较赋一个整数,包括了在C / C ++中为浮点数和比较赋一个整数的使用技巧和注意事项,需要的朋友参考一下 整数是一种数据类型,用于定义一个包含所有正,负或零个非小数值的数字。这些不能有小数。 浮点数是一种数据类型,用于定义具有小数值的数字。这些也可以有小数。 现在,当我们为两者输入相同的值时,我们将检查编译器返回的float和integer值是什么。

  • 问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。

  • 这样一个看似简单的数字怎么会“太大”而无法在64位内存中表达呢?

  • 问题内容: 比较浮点数和这样的整数是否安全? 根据JLS(5.6.2。二进制数值提升),如果其中一个参数为,则另一个参数将转换为比较之前的值。但是据我了解,如果转换后的float与原始float二进制相同,则这样的比较将返回true。我们如何确保呢? 问题答案: 是的,您的具体示例很好,因为和都可以精确地表示为。 请注意,通常情况下并非如此:有很多大值无法完全表示为。例如,即使2_000_000_