看了网上的这篇文章 9999999999999999.0 - 9999999999999998.0,大多数编程语言算出来的都是 2,包括 GoLang。我用 go 亲自写代码试了一下,结果如下:
var a = 9999999999999999.0
var b = 9999999999999998.0
const e = 9999999999999999.0
const f = 9999999999999998.0
fmt.Printf("%v\n", 9999999999999999.0-9999999999999998.0) // 输出 1
fmt.Printf("%v\n", 9999999999999999.1-9999999999999998.1) // 输出 1 ?
fmt.Printf("%v\n", e-f) // 输出 1
fmt.Printf("%v\n", float32(9999999999999999.0)-float32(9999999999999998.0)) // 输出 0
fmt.Printf("%v\n", float64(9999999999999999.1)-float64(9999999999999998.1)) // 输出 2
fmt.Printf("%v\n", float64(9999999999999999.0)-float64(9999999999999998.0)) // 输出 2
fmt.Printf("%v\n", a-b) // 输出 2
go 的版本是 version go1.21.4 windows/amd64。
不明白的是,第二条输出语句,它是按什么数据类型计算的呢?肯定不能是整数。是 float32 还是 float64?
只能说用常量进行计算的精度比用变量高。
网友评论