zhangqian
2024-04-30 7dd6097d42d6d6f254a84ab0111bac70f0358660
utils/mathx.go
@@ -1,7 +1,11 @@
package utils
import "github.com/shopspring/decimal"
import (
   "github.com/shopspring/decimal"
   "sort"
)
// Average 取平均值
func Average(numbers []decimal.Decimal) decimal.Decimal {
   if len(numbers) == 0 {
      return decimal.Decimal{}
@@ -16,6 +20,7 @@
   return sum.Div(decimal.NewFromInt(int64(len(numbers))))
}
// Deviation 偏差
func Deviation(numbers []decimal.Decimal) decimal.Decimal {
   if len(numbers) == 0 || len(numbers) == 1 {
      return decimal.Decimal{}
@@ -28,3 +33,32 @@
   }
   return diffSquaredSum.Div(decimal.NewFromInt(int64(len(numbers))))
}
// TotalDeviation 总差
func TotalDeviation(numbers []decimal.Decimal, average decimal.Decimal) decimal.Decimal {
   if len(numbers) < 2 {
      return decimal.Zero
   }
   n := len(numbers)
   ratio := decimal.NewFromFloat(0.02)
   length := decimal.NewFromInt(int64(n)).Mul(ratio).Ceil().IntPart()
   if length >= int64(n) {
      return decimal.Zero
   }
   sort.Slice(numbers, func(i, j int) bool {
      return numbers[i].LessThan(numbers[j])
   })
   minPart := numbers[:length-1]
   maxPart := numbers[length:]
   minAverage := Average(minPart)
   maxAverage := Average(maxPart)
   minDiff := minAverage.Sub(average).Abs()
   maxDiff := maxAverage.Sub(average).Abs()
   return decimal.Max(minDiff, maxDiff)
}