2017-03-16 239 views
1

運行這段代碼,看看我的意思是:Go Playground demo of issue這是strconv.ParseFloat()行爲預期還是錯誤?我怎樣才能解決它?

package main 

import (
    "fmt" 
    "strconv" 
) 

func main() { 
    // From https://golang.org/src/math/const.go 
    var SmallestNonzeroFloat64AsString string = "4.940656458412465441765687928682213723651e-324" 
    var SmallestNonzeroFloat64 float64 
    var err error 
    SmallestNonzeroFloat64, err = strconv.ParseFloat(SmallestNonzeroFloat64AsString, 64) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Printf("SmallestNonzeroFloat64 = %g\n", SmallestNonzeroFloat64) 
    fmt.Printf("SmallestNonzeroFloat64 = %s\n", strconv.FormatFloat(SmallestNonzeroFloat64, 'f', -1, 64)) 
} 

SmallestNonzeroFloat64math/const.go定義,我以爲它可以通過一個float64變量來表示。

但是,當它被解析爲float64與strconv.ParseFloat()並打印strconv.FormatFloat()結果是舍入。

而不是4.940656458412465441765687928682213723651e-324我得到5e-324(或它的非指數等價物,你可以在Go Playground結果中看到)。結果是四捨五入的。

有沒有辦法找回4.940656458412465441765687928682213723651e-324

或者它是一個錯誤?

回答

7

這不是一個錯誤。

你可以問Go打印更多數字。

fmt.Printf("SmallestNonzeroFloat64 = %.40g\n", SmallestNonzeroFloat64) 
// 4.940656458412465441765687928682213723651e-324 

然而,5e-3244.94…e-324其實都是相同的值,這樣下去是沒有錯的打印5e-324。此值(2 -1074)是Float64(也稱爲其他語言中的double)可表示的最小正數。較大的數字都是這個的倍數,例如下一個最小數目將是2×2 -1074 = 1e-323,下一個將是3×10 -1074 = 1.5e-323

在換句話說,所有的數字比5e-324更精確的將不在Float64中表示。所以在「5」之後打印更多數字是沒有意義的。而5e-324肯定比4.94…e-324更具可讀性。

+0

明確。還有幾行代碼有助於確認:[link](https://play.golang.org/p/j-a-wSXIGt) – Koala3

相關問題