java - double 理论

标签 java c# double

<分区>

以下表达式返回 false(例如在 Java 和 C# 中)

0.1 + 0.1 + 0.1 == 0.3

所以我们了解到我们总是像这样比较 double 和 float

Math.abs(double1 - double2) < epsilon

但是为什么

0.1 + 0.1 == 0.2 returns true and 
0.1 + 0.1 + 0.1 == 0.3 returns false?

我知道跟尾数有关系,但是我不知道 准确理解。

最佳答案

float / double 存储为二进制小数,而不是小数。

有些数字无法用我们的十进制表示法完全表示。比如1/3用十进制表示就是0.3333333……用二进制表示也是一样的,只是不能精确表示的数不一样。其中有数字1/10。在二进制表示法中是 0.000110011001100...

由于二进制表示法不能精确存储,所以采用四舍五入的方式存储。因此你的问题。

你不应该像这样比较 double 值:0.1 + 0.1 + 0.1 == 0.3,因为你永远不知道它们在内存中的存储方式,你永远不知道这种比较的结果是什么。

关于java - double 理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687385/

相关文章:

Java正则表达式提取方括号或圆括号内的内容

c - 为什么这个函数返回 0 而不是 double?

MySQL:从 double 转换为十进制时精度损失

java - 如何在 @RestResource 中将 'path' 设置为空,以使端点仅作为/search{?name}

java - 为什么使用 ParparedStatement、BoundStatement、Session.executeAsync 和 ResultSetFuture 的应用程序消耗如此高的 CPU?

java - 在 Logback 中以编程方式引用预先存在的附加程序的正确方法是什么?

c# - 线程池的处理器亲和性和线程创建

c# - 指定的资源名称包含无效字符 即使 Blob 名称有效,为 Blob 生成 SAS url 时也会出错

c# - 内存样本中的Naudio回放会产生声音的延迟和不美观的间隙

java - 为什么 `2.0 - 1.1` 和 `2.0F - 1.1F` 会产生不同的结果?