Permalink
Browse files

write float64

  • Loading branch information...
1 parent ba3c307 commit bdbf8dcd42c3b2d26828c944a0b32fd36aacfcda @taowen taowen committed Jan 7, 2017
Showing with 54 additions and 0 deletions.
  1. +30 −0 feature_stream_float.go
  2. +24 −0 jsoniter_float_test.go
@@ -36,4 +36,34 @@ func (stream *Stream) WriteFloat32(val float32) {
for stream.buf[stream.n - 1] == '0' {
stream.n--;
}
+}
+
+func (stream *Stream) WriteFloat64(val float64) {
+ if val < 0 {
+ stream.writeByte('-')
+ val = -val
+ }
+ if val > 0x4ffffff {
+ stream.WriteRaw(strconv.FormatFloat(val, 'f', -1, 64));
+ return
+ }
+ precision := 6
+ exp := uint64(1000000) // 6
+ lval := uint64(val * float64(exp) + 0.5)
+ stream.WriteUint64(lval / exp)
+ fval := lval % exp
+ if fval == 0 {
+ return
+ }
+ stream.writeByte('.')
+ if stream.Available() < 10 {
+ stream.Flush()
+ }
+ for p := precision - 1; p > 0 && fval < POW10[p]; p-- {
+ stream.writeByte('0')
+ }
+ stream.WriteUint64(fval);
+ for stream.buf[stream.n - 1] == '0' {
+ stream.n--;
+ }
}
@@ -58,6 +58,30 @@ func Test_write_float32(t *testing.T) {
should.Equal("abcdefg1.123456", buf.String())
}
+func Test_write_float64(t *testing.T) {
+ vals := []float64{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
+ -0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}
+ for _, val := range vals {
+ t.Run(fmt.Sprintf("%v", val), func(t *testing.T) {
+ should := require.New(t)
+ buf := &bytes.Buffer{}
+ stream := NewStream(buf, 4096)
+ stream.WriteFloat64(val)
+ stream.Flush()
+ should.Nil(stream.Error)
+ should.Equal(strconv.FormatFloat(val, 'f', -1, 64), buf.String())
+ })
+ }
+ should := require.New(t)
+ buf := &bytes.Buffer{}
+ stream := NewStream(buf, 10)
+ stream.WriteRaw("abcdefg")
+ stream.WriteFloat64(1.123456)
+ stream.Flush()
+ should.Nil(stream.Error)
+ should.Equal("abcdefg1.123456", buf.String())
+}
+
func Benchmark_jsoniter_float(b *testing.B) {
b.ReportAllocs()
for n := 0; n < b.N; n++ {

0 comments on commit bdbf8dc

Please sign in to comment.