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

Java中的双重算术和相等性

潘楚
2023-03-14
问题内容

这很奇怪(至少对我来说)。此例程显示为true:

double x = 11.0;
double y = 10.0;
if (x-y == 1.0) {
    // print true
} else {
    // print false
}

但是,此例程显示false:

double x = 1.1;
double y = 1.0;
if (x-y == 0.1) {
    // print true
} else {
    // print false
}

有人在乎解释这里发生了什么吗?我猜想它与ints构成floats的整数运算有关。另外,还有其他10具有此属性的基准(除外)?


问题答案:

1.0具有精确的二进制表示形式。0.1不。

也许您是在问为什么0.1不以1的尾数和-10的指数存储?但这不是它的工作原理。它不是十进制数字加指数,而是二进制数字。因此“乘以10”不是自然的事情。

抱歉,也许最后一部分不清楚。最好将指数视为位移。位的移位不会将像0.1(十进制)这样的无限序列转换为有限序列。



 类似资料:
  • 我想从有更多经验的人那里得到一些建议,他们在Java中使用原始的双相等。由于可能的舍入错误,对两个双和使用是不够的。 我的问题是: > 使用相对误差计算某个增量值,是否有一个通用(而不是特定于应用程序)的增量值值得推荐?请参阅下面的示例。 下面是一个通用函数,用于检查考虑相对错误的相等性。您建议的值是多少,以捕获简单操作 ,-,/,* 操作中的大部分舍入错误?

  • 问题内容: 我今天偶然地写了一些代码,当Eclipse一次不对我大吼时,我感到很惊讶。该代码对结构相等运算符()有双重使用,类似于下面的结构。 输出是 玩耍时,我注意到我除了不能使用任何类型。从这个布尔表达式是 简化为。 因此,忽略副作用等于。 谁能解释该语法如何暗示这一点? 编辑1: 在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“ 0”表示为false,

  • 问题内容: 我想从那些在Java中使用原始相等性有更多经验的人那里获得一些建议。使用两次双打,由于可能的舍入误差而不够。 我的问题是: Java 在某种程度上处理舍入错误吗?如1.7文档中所述,如果数值等于,则返回值。有人确定它们在数值上相等是什么意思吗? 对某些增量值使用相对误差计算,您会建议使用通用的增量值(不是特定于应用程序)吗?请参见下面的示例。 以下是考虑相对误差的用于检查相等性的通用函

  • 问题内容: 和之间有什么区别? 松散比较到底如何工作? 严格比较到底如何工作? 有什么有用的例子吗? 问题答案: 松散之间的差等于操作员和严格相同的运算符中被精确地说明手册: 比较运算符 松散相等的比较 如果您使用的是运营商,或者松散的使用相比其他运营商相比,诸如,或者,你总是要看看 上下文 看什么,在哪里,为什么得到的东西转化为理解是怎么回事。 转换规则 转换为布尔值 转换为整数 转换为浮点 转

  • 类MyList的公共方法TwoTogethere()返回True,当且仅当list有两个相等的相邻元素。您可以假定没有列表元素(数据)为空。以下是一些示例:当调用此方法时,列表[a,b,c,d]将返回false。而是一个清单[a、b、b、c]或[a、b、c、d、e、f、f]。方法返回true。编写public方法。您可以使用列表接口引用(字段:data、prev、next)(head、tail)(

  • 问题内容: 众所周知,即使是十进制格式的小数点后有固定数字的浮点数也无法准确表示。因此,我有以下程序要测试: 输出如下: 我无法从上述结果中回答两个问题,我正在寻求以下方面的帮助: 为什么使用的双重表示形式,并且看起来很精确,而没有。 为什么返回true? 问题答案: 我怀疑在这里不能正常工作。写入0.1时,获取确切值的一种可靠方法是write 。 “为什么0.1f + 0.2f == 0.3f返