package tools import ( "fmt" "math" ) // MoneyCalculator 金额计算工具(以分为单位) type MoneyCalculator struct{} // NewMoneyCalculator 创建金额计算器 func NewMoneyCalculator() *MoneyCalculator { return &MoneyCalculator{} } // YuanToCents 元转分 func (m *MoneyCalculator) YuanToCents(yuan float64) int64 { return int64(math.Round(yuan * 100)) } // CentsToYuan 分转元 func (m *MoneyCalculator) CentsToYuan(cents int64) float64 { return float64(cents) / 100 } // FormatYuan 格式化显示金额(分转元,保留2位小数) func (m *MoneyCalculator) FormatYuan(cents int64) string { return fmt.Sprintf("%.2f", m.CentsToYuan(cents)) } // Add 金额相加 func (m *MoneyCalculator) Add(amount1, amount2 int64) int64 { return amount1 + amount2 } // Subtract 金额相减 func (m *MoneyCalculator) Subtract(amount1, amount2 int64) int64 { return amount1 - amount2 } // Multiply 金额乘法(金额 * 数量) func (m *MoneyCalculator) Multiply(amount int64, quantity int) int64 { return amount * int64(quantity) } // MultiplyFloat 金额乘法(金额 * 浮点数,如折扣) func (m *MoneyCalculator) MultiplyFloat(amount int64, rate float64) int64 { return int64(math.Round(float64(amount) * rate)) } // Divide 金额除法(平均分配) func (m *MoneyCalculator) Divide(amount int64, count int) int64 { if count <= 0 { return 0 } return amount / int64(count) } // CalculateDiscount 计算折扣金额 func (m *MoneyCalculator) CalculateDiscount(originalAmount int64, discountRate float64) int64 { if discountRate <= 0 || discountRate >= 1 { return 0 } return int64(math.Round(float64(originalAmount) * discountRate)) } // CalculatePercentage 计算百分比金额 func (m *MoneyCalculator) CalculatePercentage(amount int64, percentage float64) int64 { return int64(math.Round(float64(amount) * percentage / 100)) } // Max 取最大金额 func (m *MoneyCalculator) Max(amounts ...int64) int64 { if len(amounts) == 0 { return 0 } max := amounts[0] for _, amount := range amounts[1:] { if amount > max { max = amount } } return max } // Min 取最小金额 func (m *MoneyCalculator) Min(amounts ...int64) int64 { if len(amounts) == 0 { return 0 } min := amounts[0] for _, amount := range amounts[1:] { if amount < min { min = amount } } return min } // IsPositive 判断是否为正数 func (m *MoneyCalculator) IsPositive(amount int64) bool { return amount > 0 } // IsZero 判断是否为零 func (m *MoneyCalculator) IsZero(amount int64) bool { return amount == 0 } // IsNegative 判断是否为负数 func (m *MoneyCalculator) IsNegative(amount int64) bool { return amount < 0 } // Equal 判断金额是否相等 func (m *MoneyCalculator) Equal(amount1, amount2 int64) bool { return amount1 == amount2 } // Greater 判断第一个金额是否大于第二个 func (m *MoneyCalculator) Greater(amount1, amount2 int64) bool { return amount1 > amount2 } // Less 判断第一个金额是否小于第二个 func (m *MoneyCalculator) Less(amount1, amount2 int64) bool { return amount1 < amount2 } // Sum 计算金额总和 func (m *MoneyCalculator) Sum(amounts ...int64) int64 { var total int64 for _, amount := range amounts { total += amount } return total } // SplitAmount 金额分摊(处理分摊不均的情况) func (m *MoneyCalculator) SplitAmount(totalAmount int64, count int) []int64 { if count <= 0 { return []int64{} } baseAmount := totalAmount / int64(count) remainder := totalAmount % int64(count) amounts := make([]int64, count) for i := 0; i < count; i++ { amounts[i] = baseAmount if int64(i) < remainder { amounts[i]++ } } return amounts } // 全局金额计算器实例 var Money = NewMoneyCalculator() // 便捷函数 func YuanToCents(yuan float64) int64 { return Money.YuanToCents(yuan) } func CentsToYuan(cents int64) float64 { return Money.CentsToYuan(cents) } func FormatYuan(cents int64) string { return Money.FormatYuan(cents) }