使用相同的浮点常量值的不同模式会导致不同的结果

时间:2019-08-13 09:54:40

标签: go floating-point ieee-754

在下面的go代码片段中,我难以理解为什么结果不同:

func main() {
    a := -0.2; b := -0.1; 
    fmt.Println(a+b)
    //Outputs expected float value with rounding error  : -0.30000000000000004
    c := (-0.2)+(-0.1)
    fmt.Println(c)
    //Will ouput -0.3 (the actual exact constant).
}

到底发生了什么,当不使用这些常量实例化float时,会以某种方式将c操作作为常量而不是float64操作执行吗? 完整的工作版本:https://play.golang.org/p/kUICDGFiMvf

感谢您提供任何见解。

1 个答案:

答案 0 :(得分:-2)

我尝试使用Java,结果是

public class StringTest {
    public static void main(String[] args) {

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

        double c = a + b;
        System.out.println(c);
      // -0.30000000000000004

    }
}

似乎任何使用二进制浮点数的编程语言都会出现此问题。某些语言的Number类型使用IEEE754标准来表示数字。 什么是IEEE-745浮动,您可以看到it