为什么Java + =会得到错误的结果,如何防止这种情况?

安迪夫

为什么Java+=会得到错误的结果,如何防止此问题?(例如,warning在IDE中以任何方式显示吗?)

我尝试了eclipse和IntelliJ,但均未显示任何警告。

样例代码:

    {
        long a = 20000000000000000L;
        double b = 90.0;
        a += b;
        System.out.println(a); // 20000000000000088 NG
    }

    {
        long a = 10000000000000000L;
        double b = 90.0;
        a += b;
        System.out.println(a); // 10000000000000090 OK
    }

    {
        long a = 20000000000000000L;
        double b = 90.0;
        a += (long) b;
        System.out.println(a); // 20000000000000090 OK
    }
Sotirios Delimanolis

根据JLS,此复合赋值表达式

a += b;

相当于

a = (long) (a + b);

由于bdouble,所以二进制数值提升在加法发生之前发生。两个操作数都转换为double值,并且加法运算采用浮点运算。

该值20000000000000090不能精确地表示为a double,因此您会失去精度,20000000000000088取而代之。然后将其转换回long具有足够精度以表示的20000000000000088

您的第二个代码段产生的10000000000000090结果可以完全表示为double

您的第三个片段相当于

a = (long) (a + (long) b);

使用整数算术20000000000000090可以表示为long

我不知道有任何工具可以警告您。

有关的:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Java和Go的gzip会得到不同的结果?

来自分类Dev

在这种情况下,为什么会得到不受支持的操作数类型?

来自分类Dev

为什么会得到以下结果?

来自分类Dev

如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

来自分类Dev

在打印语句注释掉的情况下运行为什么会得到不同的结果?

来自分类Dev

Java中的舍入问题。为什么在这种情况下我没有得到预期的结果?

来自分类Dev

为什么我会得到这种异常的PowerTop读数?

来自分类Dev

为什么以这种方式使用issubclass时会得到False?

来自分类Dev

为什么我会得到这种高度值的差异?

来自分类Dev

为什么我会得到这种异常的PowerTop读数?

来自分类Dev

为什么这个函数在较大的变量值上会得到错误的结果

来自分类Dev

在Haskell中尝试从十六进制转换为Dec时,为什么会得到错误的结果?

来自分类Dev

在Haskell中尝试从十六进制转换为Dec时,为什么会得到错误的结果?

来自分类Dev

为什么在 Java 中将字节数组转换为 BitSet 会得到错误的位表示

来自分类Dev

为什么使用withMutations会得到不同的结果?

来自分类Dev

为什么抛出OperationCanceledException会得到不同的结果?

来自分类Dev

为什么我偶尔会得到不同的结果?【C语言】

来自分类Dev

在此Java应用程序中从年,月和日开始创建新的Date时,为什么会得到错误的结果?

来自分类Dev

如何修复这个错误,为什么我会得到它?

来自分类Dev

为什么gdb会得到错误的“ optind”变量值?

来自分类Dev

为什么在使用SHFileInfo时会得到错误的SpecialFolder图标?

来自分类Dev

为什么在Swift中使用pow会得到错误的答案?

来自分类Dev

Lua:为什么会得到错误:“布尔”附近预期为“ =”?

来自分类Dev

为什么在Swift中使用pow会得到错误的答案?

来自分类Dev

为什么我的代码会得到错误的Webelements值输出?

来自分类Dev

为什么绝对定位的孩子会扩大容器的高度,如何防止这种情况?

来自分类Dev

为什么`systemctl enable rpcbind'会改变我的声音音量?以及如何防止这种情况?

来自分类Dev

为什么铬在接收到停止信号后会做出反应,以及如何防止这种情况?

来自分类Dev

为什么我会得到手册页错误以及如何在fedora core 19中修复它?

Related 相关文章

  1. 1

    为什么Java和Go的gzip会得到不同的结果?

  2. 2

    在这种情况下,为什么会得到不受支持的操作数类型?

  3. 3

    为什么会得到以下结果?

  4. 4

    如果C#中的Catch块中发生异常,会发生什么情况。在这种情况下,呼叫者也会得到什么结果

  5. 5

    在打印语句注释掉的情况下运行为什么会得到不同的结果?

  6. 6

    Java中的舍入问题。为什么在这种情况下我没有得到预期的结果?

  7. 7

    为什么我会得到这种异常的PowerTop读数?

  8. 8

    为什么以这种方式使用issubclass时会得到False?

  9. 9

    为什么我会得到这种高度值的差异?

  10. 10

    为什么我会得到这种异常的PowerTop读数?

  11. 11

    为什么这个函数在较大的变量值上会得到错误的结果

  12. 12

    在Haskell中尝试从十六进制转换为Dec时,为什么会得到错误的结果?

  13. 13

    在Haskell中尝试从十六进制转换为Dec时,为什么会得到错误的结果?

  14. 14

    为什么在 Java 中将字节数组转换为 BitSet 会得到错误的位表示

  15. 15

    为什么使用withMutations会得到不同的结果?

  16. 16

    为什么抛出OperationCanceledException会得到不同的结果?

  17. 17

    为什么我偶尔会得到不同的结果?【C语言】

  18. 18

    在此Java应用程序中从年,月和日开始创建新的Date时,为什么会得到错误的结果?

  19. 19

    如何修复这个错误,为什么我会得到它?

  20. 20

    为什么gdb会得到错误的“ optind”变量值?

  21. 21

    为什么在使用SHFileInfo时会得到错误的SpecialFolder图标?

  22. 22

    为什么在Swift中使用pow会得到错误的答案?

  23. 23

    Lua:为什么会得到错误:“布尔”附近预期为“ =”?

  24. 24

    为什么在Swift中使用pow会得到错误的答案?

  25. 25

    为什么我的代码会得到错误的Webelements值输出?

  26. 26

    为什么绝对定位的孩子会扩大容器的高度,如何防止这种情况?

  27. 27

    为什么`systemctl enable rpcbind'会改变我的声音音量?以及如何防止这种情况?

  28. 28

    为什么铬在接收到停止信号后会做出反应,以及如何防止这种情况?

  29. 29

    为什么我会得到手册页错误以及如何在fedora core 19中修复它?

热门标签

归档