java - 为什么这两个表达式计算出不同的值?

标签 java

我似乎无法找到为什么这两个表达式计算出不同的结果。有人可以启发我吗?

double var1 = 53, var2 = 51.95;
int res1 = (int)((var1 - var2)*100);
int res2 = (int)(var1*100 - var2*100);

Output: res1 = 104   res2 = 105

最佳答案

浮点无法精确存储所有值,特别是它们无法精确存储所有十进制值。 51.95 无法存储在 double 中 - 您真正存储的是接近该值。当您将几乎但不完全的值乘以 100 时,就会放大该误差。 res1res2 执行此操作的方式略有不同,因此它们得到略有不同的结果也就不足为奇了。

这里有更多细节。

您可以使用this converter弄清楚 double 的真正值(value)是什么。例如,51.95 的二进制表示形式为 01000010010011111100110011001101,对应于十进制数 51.95000076293945。这是 var2真实值;这是 double 可以表示的最接近 51.95 的数字。 var1 就是它看起来的样子,53。

那么,我们首先看一下 res1。 53 - 51.95000076293945 是 1.04999923706055。使用该转换器,我们发现该值不能精确地存储在 double 型中;你实际上会得到什么 1.0499992。将其乘以 100,得到 104.99992,它被截断为 int 104。

现在res2。 53*100是5300,51.95000076293945*100是5195.000076293945,实际上是5195.0。 5300-5195.0 是 105。

关于java - 为什么这两个表达式计算出不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26248582/

相关文章:

java - 记录OutOfMemoryError的JVM中的全局状态?

java - 从 GUI 启动命令行工具

java - 在 Java 的 arrayList 中递增 Integer 的最佳方法

java - 在 Java 8 中将 while 循环转换为流

java - Activity 和 Context 的差异以及获取它们的方法

java - <html :errors> struts tutorial or example

java - 如何为正在调用其他私有(private)方法的私有(private) void 方法编写单元测试?

java - 我似乎无法让 Java 读取我的文本文档

Java Elasticsearch 客户端结构

java - 如何在Spring Boot测试中打印@sql注释中脚本文件的完整路径