您可以将float32
值转换回float64
,仅用于验证.
要判断转换后的值是否表示相同的值,只需将其与原始值(输入)进行比较.只返回ok bool
个信息(而不是error
)也足够/惯用:
func convert(input float64) (output float32, ok bool) {
output = float32(input)
ok = float64(output) == input
return
}
(注意:不会选中像NaN
这样的边缘情况.)
测试:
fmt.Println(convert(1))
fmt.Println(convert(1.5))
fmt.Println(convert(0.123456789))
fmt.Println(convert(math.MaxFloat32))
输出(在Go Playground上试用):
1 true
1.5 true
0.12345679 false
3.4028235e+38 true
请注意,这通常会得到ok = false
个结果,因为float32
的精度低于float64
,即使转换后的值可能非常接近输入.
因此,在实践中,判断转换值的差异会更有用.您建议的解决方案判断的绝对差值并不是很有用:例如,1000000.1
和1000000
是非常接近的数字,即使差值是0.1
.0.0001
和0.00011
的差异要小得多:0.00001
,但与数字相比,差异要大得多.
因此,您应该判断相对差异,例如:
func convert(input float64) (output float32, ok bool) {
const maxRelDiff = 1e-8
output = float32(input)
diff := math.Abs(float64(output) - input)
ok = diff <= math.Abs(input)*maxRelDiff
return
}
测试:
fmt.Println(convert(1))
fmt.Println(convert(1.5))
fmt.Println(convert(1e20))
fmt.Println(convert(math.Pi))
fmt.Println(convert(0.123456789))
fmt.Println(convert(math.MaxFloat32))
输出(在Go Playground上试用):
1 true
1.5 true
1e+20 false
3.1415927 false
0.12345679 false
3.4028235e+38 true