feature_stream_float.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 32))
  11. }
  12. func (stream *Stream) WriteFloat32Lossy(val float32) {
  13. if val < 0 {
  14. stream.writeByte('-')
  15. val = -val
  16. }
  17. if val > 0x4ffffff {
  18. stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 32))
  19. return
  20. }
  21. precision := 6
  22. exp := uint64(1000000) // 6
  23. lval := uint64(float64(val)*float64(exp) + 0.5)
  24. stream.WriteUint64(lval / exp)
  25. fval := lval % exp
  26. if fval == 0 {
  27. return
  28. }
  29. stream.writeByte('.')
  30. stream.ensure(10)
  31. for p := precision - 1; p > 0 && fval < _POW10[p]; p-- {
  32. stream.writeByte('0')
  33. }
  34. stream.WriteUint64(fval)
  35. for stream.buf[stream.n-1] == '0' {
  36. stream.n--
  37. }
  38. }
  39. func (stream *Stream) WriteFloat64(val float64) {
  40. stream.WriteRaw(strconv.FormatFloat(float64(val), 'f', -1, 64))
  41. }
  42. func (stream *Stream) WriteFloat64Lossy(val float64) {
  43. if val < 0 {
  44. stream.writeByte('-')
  45. val = -val
  46. }
  47. if val > 0x4ffffff {
  48. stream.WriteRaw(strconv.FormatFloat(val, 'f', -1, 64))
  49. return
  50. }
  51. precision := 6
  52. exp := uint64(1000000) // 6
  53. lval := uint64(val*float64(exp) + 0.5)
  54. stream.WriteUint64(lval / exp)
  55. fval := lval % exp
  56. if fval == 0 {
  57. return
  58. }
  59. stream.writeByte('.')
  60. stream.ensure(10)
  61. for p := precision - 1; p > 0 && fval < _POW10[p]; p-- {
  62. stream.writeByte('0')
  63. }
  64. stream.WriteUint64(fval)
  65. for stream.buf[stream.n-1] == '0' {
  66. stream.n--
  67. }
  68. }