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

标签 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 时,go 是否以某种方式将 c 操作作为常量而不是 float64 操作执行? 完整工作版本:https://play.golang.org/p/kUICDGFiMvf

如有任何见解,我们将不胜感激。

最佳答案

我尝试使用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

    }
}

似乎任何使用二进制 float 的编程语言都会有这个问题。某些语言的 Number 类型使用 IEEE754 标准来表示数字。 什么是IEEE-745 float,你可以看it .

关于go - 使用相同浮点常量值的不同模式会导致不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475303/

相关文章:

go - 如何高效关闭 channel ?

go - 如何通过client-go在Pod的容器中执行多个命令?

binary - 将十六进制转换为 IEEE-754 单精度浮点二进制科学计数法

c# - 标准 float 的 0 和 1 之间有多少个唯一值?

go - 未搜索 Html 模板文件

templates - tmpl.Execute 和子文件 golang

python float 到 in int 转换

c - 如何测试定点库?

c# - 模数运算如何与 float 数据类型一起使用?

matlab - 将数值转换为字符向量时未获得预期结果