差异
在 Go 中,以下代码片段揭示了浮点的有趣差异计算:
package main import ( "fmt" ) func main() { x := 10.1 fmt.Println("x == 10.1: ", x == 10.1) fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0) }
执行时,此代码会产生意外结果:
x == 10.1: true x*3.0 == 10.1*3.0: false
使用声明的变量 (x) 或文字执行相同的浮点运算(10.1),相等性检查失败。
起源差异
要理解这种行为,必须深入研究 Go 对浮点数的处理。常量和数字文字最初是无类型的并且具有无限精度。但是,当分配给变量或进行类型转换时,它们会继承目标类型的限制。
当分配 x := 10.1 时,文字 10.1 由于转换为浮点数而丢失一些精度。相反,10.1*3.0 在计算中保持其完整精度。这解释了观察到的值差异和错误的相等性检查。
文档和基本原理
Go 博客文章的“Floats”部分概述了此行为Constants:
“数字常量存在于任意精度的数字空间中;它们只是常规数字。但是当它们被分配给一个变量,该值必须能够适合目标。”
虽然这种行为背后的机制,特别是在常量非常大的情况下,仍然有些模糊,但它提供了对浮动复杂性的宝贵见解。 Go 中的点表示。这些知识使开发人员能够有效地预测和处理代码中与精度相关的问题。
以上是为什么 Go 中比较变量和文字时浮点相等会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!