代码展示精度丢失
package main
import (
"fmt"
)
func main() {
num := 1.999999999999999999
intNum := int(num)
fmt.Printf("原始浮点数: %f\n", num)
fmt.Printf("转换后的整数: %d\n", intNum)
}
精度丢失原因
- 浮点数存储原理:
float64
在Go语言中遵循IEEE 754标准,它使用64位来表示一个浮点数,其中1位符号位,11位指数位,52位尾数位。
- 例如
1.999999999999999999
这样的数,在浮点数表示中无法精确存储,它在内存中的实际存储值可能与真实值略有偏差。
- 转换过程:
- 当从
float64
转换为int
时,Go语言会直接截断小数部分,只保留整数部分。所以1.999999999999999999
转换为int
后就是1
,导致精度丢失。
避免精度问题的方法
- 四舍五入:
- 使用
math.Round
函数实现四舍五入后再转换。例如:
package main
import (
"fmt"
"math"
)
func main() {
num := 1.999999999999999999
rounded := math.Round(num)
intNum := int(rounded)
fmt.Printf("原始浮点数: %f\n", num)
fmt.Printf("四舍五入后转换的整数: %d\n", intNum)
}
- 设置精度阈值:
- 如果业务允许一定的误差范围,可以设置一个精度阈值。例如,当浮点数减去其整数部分小于某个阈值(如0.0001)时,可认为其小数部分可忽略不计,直接转换为整数。
package main
import (
"fmt"
)
func main() {
num := 1.999999999999999999
threshold := 0.0001
intPart := int(num)
if num - float64(intPart) < threshold {
intNum := int(num)
fmt.Printf("原始浮点数: %f\n", num)
fmt.Printf("按阈值转换的整数: %d\n", intNum)
}
}