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

加减双打给出奇怪的结果

缪嘉志
2023-03-14
问题内容

因此,当我在Java中使用Doubles进行加法或减法时,它会给我带来奇怪的结果。这里有一些:

如果我加上0.0 + 5.1,它给了我5.1。没错

如果我添加5.1 + 0.1,它会给我5.199999999999(重复9s 的数量可能会关闭)。错了

如果我减去4.8 - 0.4,它就会给我4.39999999999995(再次,重复的9s可能会关闭)。错了

起初我以为这只是将双精度数与十进制值相加的问题,但我错了。以下工作正常:

5.1 + 0.2 = 5.3
5.1 - 0.3 = 4.8

现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从捕获文本JTextField。例如:

//doubleNum = 5.1 RIGHT HERE
//The textfield has only a "0.1" in it.
doubleNum += Double.parseDouble(textField.getText());
//doubleNum = 5.199999999999999

问题答案:

在Java中,double值是IEEE浮点数。除非它们是2的幂(或2的幂的和,例如1/8
+ 1/4 =
3/8),否则即使它们具有很高的精度,也无法准确表示它们。一些浮点运算会加重这些浮点数中存在的舍入误差。在上述情况下,浮点错误已变得足够重要,可以显示在输出中。

无论是从a解析字符串JTextField还是指定double文字,数字的来源都无关紧要-问题是浮点表示形式的继承。

解决方法:

  • 如果知道只有这么多小数点,请使用整数算术,然后转换为小数:

    (double) (51 + 1) / 10
    

    (double) (48 - 4) / 10

  • 使用BigDecimal

  • 如果必须使用double,则可以使用Kahan Summation Algorithm减少浮点错误。



 类似资料:
  • 问题内容: 试图在LINQ查询(使用Entityframework)中实现条件创建了奇怪的查询。在某些情况下,即使阈值设置为180秒,这些查询也会超时: 使用一些不太优雅的if语句,我没有任何问题,查询在几秒钟内返回: 条件语句都是从查询字符串传递的,这就是为什么它们有时可能带有值而有时却没有值的原因。 使用三元运算符时会出现相同的问题 关于这些内联条件为何表现如此差的情况,是否有合理的解释? 问

  • 问题内容: 我似乎在数组上使用时发现了一个陷阱,但是我找不到解释。本质上,如果我尝试对一个大数组求和,那么我会开始得到荒谬的答案,但这是 无声的, 而且我无法充分理解输出结果,而不是Google的原因。 例如,这完全按预期工作: 为两者提供相同的输出: 但是,这不起作用: 提供以下输出: 在更大的阵列上,有可能获得正面的结果。这是更隐蔽的,因为我可能根本不知道发生了什么不寻常的事情。例如: 给出以

  • 当试图从Hitbox API获取数据时,我得到了一个奇怪的结果。对于一个API的命令,这种情况每次都会发生,而对于另一个API的命令,这种情况只是有时发生。结果差不多是这样(这是我得到的最后一个结果): \U001F\B\0\0\0\0\0\U0003W8SμMU~S N T&N G6C$Z%9IGF[(\U0005\U000F(:6\U000F\B P C\U0015\N\U007F V\U00

  • 我有一个程序可以读取两个文件(“incompleta.txt”和“completa.txt”),并比较两个文件中是否有相同的名称。其工作原理如下: 它将“completa.txt”中的所有名称存储在ArrayList中 问题是我的“lista.txt”看起来像这样:Image 第二条线完全是混乱和扭曲的。 我的Java代码:

  • 我使用Oracle11g(在Red Hat上)。我有一个带有XMLType列的简单常规表: 我使用Oracle SQL Developer(在Windows上): 很管用。我只有一个牢房。我可以双击并下载整个XML文件。 然后我试图以CLOB的形式得到结果: 很管用。我只有一个牢房。我可以双击并看到整个文本和复制它。但有个问题。当我把它复制到剪贴板时,我只得到前4000个字符。似乎在4000位置有

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