May*_*tel 7 floating-point precision go
虽然在Go中丢失了将float32数转换为float64的精度.例如,将359.9转换为float64会生成359.8999938964844.如果float32可以精确存储,为什么float64会丢失精度?
示例代码:
package main
import (
"fmt"
)
func main() {
var a float32 = 359.9
fmt.Println(a)
fmt.Println(float64(a))
}
Run Code Online (Sandbox Code Playgroud)
试试 Playground
小智 10
你永远不会从一个转换时丢失精度float
(即FLOAT32)到double
(float64).前者必须是后者的一个子集.
它更多地与输出格式化程序的默认精度有关.
最接近的IEEE754 float
到359.9是
359.899993896484375
Run Code Online (Sandbox Code Playgroud)
最接近的IEEE754 double
到359.9是
359.8999999999999772626324556767940521240234375
Run Code Online (Sandbox Code Playgroud)
最近的IEEE754 double
到359.899993896484375是
359.899993896484375
Run Code Online (Sandbox Code Playgroud)
(即是相同的;由于我已经提到的子集规则).
所以你可以看到它float64(a)
和float64(359.899993896484375)
它是一样的359.899993896484375
.这解释了输出,虽然您的格式化程序正在舍入最后的2位数.
这有助于我理解@ FaceyMcFaceFace的答案:
var a float32 = math.Pi
fmt.Println(a)
fmt.Println(float64(a))
fmt.Println(float64(math.Pi))
3.1415927
3.1415927410125732
3.141592653589793
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/-bAQLqjlLG
归档时间: |
|
查看次数: |
4589 次 |
最近记录: |