I've noticed some strange behavior with the way go unmarshals json floats. Some numbers, but not all, refuse to unmarshal correctly. Fixing this is as easy as using a float64 instead of a float32 in the destination variable, but for the life of me I can't find a good reason why this is the case.
Here is code that demonstrates the problem:
package main
import (
"encoding/json"
"fmt"
. "github.com/shopspring/decimal"
)
func main() {
bytes, _ := json.Marshal(369.1368) // not every number is broken, but this one is
fmt.Println("bytes", string(bytes))
var f32 float32
json.Unmarshal(bytes, &f32)
fmt.Printf("f32 %f\n", f32) // adds an extra 0.00001 to the number
var d Decimal
json.Unmarshal(bytes, &d)
fmt.Printf("d %s\n", d) // 3rd party packages work
// naw, you can just float64
var f64 float64
json.Unmarshal(bytes, &f64)
fmt.Printf("f64 %f\n", f64) // float64 works
}
A float64 isn't required to accurately represent my example number, so why is required here?
Go playground link: https://play.golang.org/p/tHkonQtZoCt