decimal.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package utils
  2. import "github.com/shopspring/decimal"
  3. func FloatAdd(src, dst float64, round int32) float64 {
  4. decimalResult := decimal.NewFromFloat(src).Add(decimal.NewFromFloat(dst))
  5. return ParseRound(decimalResult, round)
  6. }
  7. func FloatAddSlice(data []float64, round int32) float64 {
  8. decimalResult := decimal.NewFromFloat(data[0])
  9. for _, v := range data[1:] {
  10. decimalResult = decimalResult.Add(decimal.NewFromFloat(v))
  11. }
  12. return ParseRound(decimalResult, round)
  13. }
  14. func FloatSub(src, dst float64, round int32) float64 {
  15. decimalResult := decimal.NewFromFloat(src).Sub(decimal.NewFromFloat(dst))
  16. return ParseRound(decimalResult, round)
  17. }
  18. func FloatSubSlice(data []float64, round int32) float64 {
  19. decimalResult := decimal.NewFromFloat(data[0])
  20. for _, v := range data[1:] {
  21. decimalResult = decimalResult.Sub(decimal.NewFromFloat(v))
  22. }
  23. return ParseRound(decimalResult, round)
  24. }
  25. func FloatMul(src, dst float64, round int32) float64 {
  26. decimalResult := decimal.NewFromFloat(src).Mul(decimal.NewFromFloat(dst))
  27. return ParseRound(decimalResult, round)
  28. }
  29. func FloatMulSlice(data []float64, round int32) float64 {
  30. decimalResult := decimal.NewFromFloat(data[0])
  31. for _, v := range data[1:] {
  32. decimalResult = decimalResult.Mul(decimal.NewFromFloat(v))
  33. }
  34. return ParseRound(decimalResult, round)
  35. }
  36. func FloatDiv(src, dst float64, round int32) float64 {
  37. decimalResult := decimal.NewFromFloat(src).Div(decimal.NewFromFloat(dst))
  38. return ParseRound(decimalResult, round)
  39. }
  40. func ParseRound(decimalResult decimal.Decimal, round int32) float64 {
  41. if round >= 0 {
  42. decimalResult = decimalResult.Round(round)
  43. }
  44. res, _ := decimalResult.Float64()
  45. return res
  46. }
  47. func FloatRound(src float64, num int32) float64 {
  48. res, _ := decimal.NewFromFloat(src).Round(num).Float64()
  49. return res
  50. }