Golang是一種開源編程語言,支持跨平臺開發(fā),擁有高效的編譯速度和并發(fā)編程能力,因此被越來越多的開發(fā)者所青睞。然而,當使用Golang進行json解析時,會發(fā)現(xiàn)精度不準,這給我們帶來了一些困擾。
在Golang中,使用json.Unmarshal()函數(shù)解析json數(shù)據(jù)時,經(jīng)常會遇到浮點數(shù)精度不準的問題。比如以下的json數(shù)據(jù):
{ "name" : "張三", "score" : 99.9999999999999 }
假如我們定義了如下的結(jié)構(gòu)體:
type Student struct { Name string `json:"name"` Score float64 `json:"score"` }
然后,使用json.Unmarshal()函數(shù)進行解析,代碼如下:
var stu Student err := json.Unmarshal([]byte(data), &stu)
解析完成后,我們會發(fā)現(xiàn)stu.Score的值變成了99.99999999999989,比原來少了1個9,這是由于Golang默認使用float64類型來表示浮點數(shù),而float64類型只能表示15位有效數(shù)字。對于超出這個限制的數(shù)字,在解析時就會產(chǎn)生精度誤差。
為了解決這個問題,我們可以使用Golang內(nèi)置的json.Decoder(),它可以從io.Reader中一邊讀取一邊解析json數(shù)據(jù)。同時,我們可以使用json.Number類型來表示浮點數(shù),它可以解決精度不準的問題。代碼如下:
decoder := json.NewDecoder(strings.NewReader(data)) var stu Student for { if err := decoder.Decode(&stu); err == io.EOF { break } else if err != nil { fmt.Println(err) } } type Student struct { Name string `json:"name"` Score json.Number `json:"score"` }
在上面的代碼中,我們使用json.Number類型來代替float64類型,這樣解析出來的值就會保留原來的精度。
總之,Golang中json解析精度不準的問題是由于float64類型的限制所致。如果我們需要解析高精度的浮點數(shù),可以使用json.Number類型來代替。同時,使用json.Decoder()可以逐步讀取和解析json數(shù)據(jù)。