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

减去两个十进制数字会得到奇怪的输出

阎阎宝
2023-03-14
问题内容

当我在玩Java Puzzlers的代码(我没有书)时,遇到了这段代码

public static void main(String args[]) {
        System.out.println(2.00 - 1.10);
    }

输出为

0.8999999999999999

当我尝试将代码更改为

2.00d - 1.10d 我仍然得到与 0.8999999999999999

对于,2.00d - 1.10f输出0.8999999761581421
为,2.00f - 1.10d输出0.8999999999999999
为,2.00f - 1.10f输出为0.9

为什么我不首先得到输出0.9?我不能为此做出任何正面或反面吗?有人可以说清楚吗?


问题答案:

二进制0.1是0.00011001100110011001100110011001 .....,

因此,它不能精确地用二进制表示。根据四舍五入的位置(浮动或两倍),您会得到不同的答案。

因此0.1f = 0.000110011001100110011001100和0.1d =
0.0001100110011001100110011001100110011001100110011001

您注意到该数字重复1100周期。但是,浮点精度和双精度将其在循环中的不同点拆分。因此,错误会四舍五入,另一错误会四舍五入。导致差异。

但最重要的是; 永远不要假设浮点数是正确的



 类似资料:
  • 我正在做两个大的十进制数的减法。在减法中,它们都具有非零精度,但结果的精度为0。 据我所知,精度为0的大十进制数是不可能的。即使0的精度也为1。 精度是未标度值中的位数。例如,对于数字123.45,返回的精度为5。 (另请参阅BigDecimal、精度和比例)。 问题区域: 返回从此行创建的bigDecimal 对于上下文<代码>中心。实数=-0.79,这是一个双精度。 所以它是有效的 倒标度仅为

  • 问题内容: 如果我运行以下程序,则该程序将分析两个日期字符串(相隔1秒),并对其进行比较: 输出为: 为什么是(正如我从一秒钟的时间差中期望的那样),但是353呢? 如果我将日期更改为1秒后的时间: 然后ld4-ld3将1。 Java版本: 问题答案: 有关1927年上海的详细信息,。基本上在1927年底的午夜,时钟回到了5分52秒。因此,“ 1927-12-31 23:54:08”实际上发生了两

  • 最近我遇到了一个编程难题,我一生都找不到一个满意的答案:计算字符串给出的两个任意大整数之和,其中第二个整数可能是负数。这是在Java中完成的,没有使用任何BigInteger、BigNumber等类。 我最初使用伪代码的方法如下: 如果第二个字符串的第一个字符是'-',则设置减法标志。 将每个字符串转换为一个整数数组,每个数字一个。 用零扩展最短数组和左键,以便两个数组大小相同。 循环遍历数组的每

  • 问题内容: 为什么当我这样做: 我得到0,但是当我得到 我有价值吗? 我本来希望更高的精度除法返回更高的精度结果,为什么不是这种情况呢? 问题答案: 发生这种情况的原因是,对于数学运算,使用http://msdn.microsoft.com/zh- cn/library/ms190476.aspx#division中 找到的规则来计算得出的精度和小数位数 操作 e1 / e2 结果精度 p1-s1

  • 问题内容: 我遇到此行的问题(在下面评论): 输出。 但是,输出。 现在,我不明白为什么我得到这个结果: 问题答案: 您缺少一组括号: 在您的版本中,正在通过与进行比较,这不是您想要的。 通常,的优先级高于,这就是为什么将其评估为的原因。