feature_stream_float.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package jsoniter
  2. import (
  3. "strconv"
  4. )
  5. var POW10 []uint64
  6. func init() {
  7. POW10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000}
  8. }
  9. func (stream *Stream) WriteFloat32(val float32) {
  10. if val < 0 {
  11. stream.writeByte('-')
  12. val = -val
  13. }
  14. if val > 0x4ffffff {
  15. stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 32));
  16. return
  17. }
  18. precision := 6
  19. exp := uint64(1000000) // 6
  20. lval := uint64(float64(val) * float64(exp) + 0.5)
  21. stream.WriteUint64(lval / exp)
  22. fval := lval % exp
  23. if fval == 0 {
  24. return
  25. }
  26. stream.writeByte('.')
  27. if stream.Available() < 10 {
  28. stream.Flush()
  29. }
  30. for p := precision - 1; p > 0 && fval < POW10[p]; p-- {
  31. stream.writeByte('0')
  32. }
  33. stream.WriteUint64(fval)
  34. for stream.buf[stream.n - 1] == '0' {
  35. stream.n--
  36. }
  37. }
  38. func (stream *Stream) WriteFloat64(val float64) {
  39. if val < 0 {
  40. stream.writeByte('-')
  41. val = -val
  42. }
  43. if val > 0x4ffffff {
  44. stream.WriteRaw(strconv.FormatFloat(val, 'f', -1, 64));
  45. return
  46. }
  47. precision := 6
  48. exp := uint64(1000000) // 6
  49. lval := uint64(val * float64(exp) + 0.5)
  50. stream.WriteUint64(lval / exp)
  51. fval := lval % exp
  52. if fval == 0 {
  53. return
  54. }
  55. stream.writeByte('.')
  56. if stream.Available() < 10 {
  57. stream.Flush()
  58. }
  59. for p := precision - 1; p > 0 && fval < POW10[p]; p-- {
  60. stream.writeByte('0')
  61. }
  62. stream.WriteUint64(fval)
  63. for stream.buf[stream.n - 1] == '0' {
  64. stream.n--
  65. }
  66. }