feature_stream_float.go 755 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package jsoniter
  2. import "strconv"
  3. var POW10 []uint64
  4. func init() {
  5. POW10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000}
  6. }
  7. func (stream *Stream) WriteFloat32(val float32) {
  8. if val < 0 {
  9. stream.writeByte('-')
  10. val = -val
  11. }
  12. if val > 0x4ffffff {
  13. stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 32));
  14. return
  15. }
  16. precision := 6
  17. exp := uint64(1000000) // 6
  18. lval := uint64(float64(val) * float64(exp) + 0.5)
  19. stream.WriteUint64(lval / exp)
  20. fval := lval % exp
  21. if fval == 0 {
  22. return
  23. }
  24. stream.writeByte('.')
  25. if stream.Available() < 10 {
  26. stream.Flush()
  27. }
  28. for p := precision - 1; p > 0 && fval < POW10[p]; p-- {
  29. stream.writeByte('0')
  30. }
  31. stream.WriteUint64(fval);
  32. for stream.buf[stream.n - 1] == '0' {
  33. stream.n--;
  34. }
  35. }