diff --git a/marshaler.go b/marshaler.go index 3d87dab6..ac47344a 100644 --- a/marshaler.go +++ b/marshaler.go @@ -5,6 +5,7 @@ import ( "encoding" "fmt" "io" + "math" "reflect" "sort" "strconv" @@ -244,9 +245,17 @@ func (enc *Encoder) encode(b []byte, ctx encoderCtx, v reflect.Value) ([]byte, e case reflect.String: b = enc.encodeString(b, v.String(), ctx.options) case reflect.Float32: - b = strconv.AppendFloat(b, v.Float(), 'f', -1, 32) + if math.Trunc(v.Float()) == v.Float() { + b = strconv.AppendFloat(b, v.Float(), 'f', 1, 32) + } else { + b = strconv.AppendFloat(b, v.Float(), 'f', -1, 32) + } case reflect.Float64: - b = strconv.AppendFloat(b, v.Float(), 'f', -1, 64) + if math.Trunc(v.Float()) == v.Float() { + b = strconv.AppendFloat(b, v.Float(), 'f', 1, 64) + } else { + b = strconv.AppendFloat(b, v.Float(), 'f', -1, 64) + } case reflect.Bool: if v.Bool() { b = append(b, "true"...) diff --git a/marshaler_test.go b/marshaler_test.go index dcc976d7..376858d5 100644 --- a/marshaler_test.go +++ b/marshaler_test.go @@ -822,3 +822,26 @@ func ExampleMarshal() { // Name = 'go-toml' // Tags = ['go', 'toml'] } + +func TestIssue571(t *testing.T) { + type Foo struct { + Float32 float32 + Float64 float64 + } + + const closeEnough = 1e-9 + + foo := Foo{ + Float32: 42, + Float64: 43, + } + b, err := toml.Marshal(foo) + require.NoError(t, err) + + var foo2 Foo + err = toml.Unmarshal(b, &foo2) + require.NoError(t, err) + + assert.InDelta(t, 42, foo2.Float32, closeEnough) + assert.InDelta(t, 43, foo2.Float64, closeEnough) +}