gpt4 book ai didi

java - 为什么在 Java 中存储为 float 和 double 的相同值之间存在差异?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:55 25 4
gpt4 key购买 nike

我希望生成以下代码:“两者相等”,但我得到“两者不相等”:

float a=1.3f;
double b=1.3;
if(a==b)
{
System.out.println("Both are equal");
}
else{
System.out.println("Both are NOT equal");
}

这是什么原因?

最佳答案

这是因为最接近 1.3 的浮点值与最接近 1.3 的 double 值不同。这两个值都恰好 1.3 - 不能用非循环二进制表示法精确表示。

为了对发生这种情况的原因给出不同的理解,假设我们有两个decimal 浮点类型 - decimal5decimal10,其中数字表示有效数字的个数。现在假设我们试图将“三分之一”的值分配给他们两个。你最终会得到

decimal5 oneThird = 0.33333
decimal10 oneThird = 0.3333333333

显然这些值不相等。这里完全一样,只是涉及不同的基础。

但是,如果您将值限制为不太精确的类型,您会发现它们在这种特殊情况下是相等的:

double d = 1.3d;
float f = 1.3f;
System.out.println((float) d == f); // Prints true

但是,不能保证一定是这种情况。有时,从十进制字面值到 double 表示的近似,然后将该值近似到浮点表示,结果不如直接小数到浮点近似精确。这个 1.0000001788139343 的一个例子(感谢 stephentyrone 找到这个例子)。

更安全的是,您可以在 double 之间进行比较,但在原始赋值中使用 float 文字:

double d = 1.3f;
float f = 1.3f;
System.out.println(d == f); // Prints true

在后一种情况下,有点像在说:

decimal10 oneThird = 0.3333300000

但是,正如评论中所指出的,您几乎可以肯定不应该将浮点值与== 进行比较。这几乎从来不是正确的做法,因为正是这种事情。通常,如果你想比较两个值,你会通过某种“模糊”相等比较来进行比较,检查这两个数字是否“足够接近”以达到你的目的。查看Java Traps: double页面了解更多信息。

如果您确实需要检查绝对相等性,这通常表明您应该首先使用不同的数字格式 - 例如,对于财务数据,您可能应该使用 BigDecimal

关于java - 为什么在 Java 中存储为 float 和 double 的相同值之间存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1502236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com