代码之家  ›  专栏  ›  技术社区  ›  hellzone

为什么浮点数是精确的而算术运算不是?[副本]

  •  0
  • hellzone  · 技术社区  · 6 年前

    这个问题已经有了答案:

    为什么浮点数是精确的而算术运算不是?我的意思是编译器不是舍入到最接近的数字来表示两个数字,而不仅仅是算术运算的结果?

    double a = 0.1;
    double b = 0.2;
    System.out.println(a);
    System.out.println(b);
    System.out.println(a + b);
    

    输出;

    0.1
    0.2
    0.30000000000000004
    

    我所期望的;

    0.10000000000000001
    0.20000000000000003
    0.30000000000000004
    

    编辑: 这些操作之间有什么区别?

    double a = 0.3;
    double b = 0.1 + 0.2;
    System.out.println(a);   //0.3
    System.out.println(b);   //0.300000000000004
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   L.Spillner    6 年前

    转换文本时(例如 this converter)您将看到位表示是 最精确的 一个。然而 实际的 存储值略有不同,这导致:

    0.1 = 1.00000000000000005551115123126E-1
    0.2 = 2.00000000000000011102230246252E-1
    0.3 = 2.99999999999999988897769753748E-1

    正如你所看到的,文字表示的总和 0.30000000000000004 但不会产生与 零点三 因此,输出值的处理方式与 零点三 是的。