90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utility
 | 
						||
 | 
						||
import (
 | 
						||
	"math/rand"
 | 
						||
	"time"
 | 
						||
 | 
						||
	"github.com/shopspring/decimal"
 | 
						||
)
 | 
						||
 | 
						||
func StrToDecimal(data string) decimal.Decimal {
 | 
						||
	result, _ := decimal.NewFromString(data)
 | 
						||
 | 
						||
	return result
 | 
						||
}
 | 
						||
 | 
						||
// DecimalCutStr 按保留的小数点位数,去掉多余的小数 非四舍五入
 | 
						||
func DecimalCutStr(num decimal.Decimal, size int32) string {
 | 
						||
	if num.Cmp(decimal.Zero) == 0 {
 | 
						||
		return `0`
 | 
						||
	}
 | 
						||
 | 
						||
	str := num.Truncate(size)
 | 
						||
	result := str.String()
 | 
						||
	return result
 | 
						||
}
 | 
						||
 | 
						||
// Random 生成一个在 [start, end] 范围内的随机数,保留一位小数
 | 
						||
// start 开始数字
 | 
						||
// end 结束数字
 | 
						||
// floatNum 保留小数位数
 | 
						||
func DecimalRandom(start, end decimal.Decimal, floatNum int) decimal.Decimal {
 | 
						||
	// 创建一个本地随机数生成器
 | 
						||
	r := rand.New(rand.NewSource(time.Now().UnixNano()))
 | 
						||
 | 
						||
	// 将 start 和 end 转换为浮点数
 | 
						||
	startFloat, _ := start.Float64()
 | 
						||
	endFloat, _ := end.Float64()
 | 
						||
 | 
						||
	// 生成随机数
 | 
						||
	randomFloat := startFloat + r.Float64()*(endFloat-startFloat)
 | 
						||
 | 
						||
	// 保留一位小数
 | 
						||
	randomDecimal := decimal.NewFromFloat(randomFloat).Round(int32(floatNum))
 | 
						||
 | 
						||
	return randomDecimal
 | 
						||
}
 | 
						||
 | 
						||
// DiscardDecimal 舍弃 decimal 类型的最后指定位数小数
 | 
						||
// value: 输入的 decimal 值
 | 
						||
// discardDigits: 需要舍弃的小数位数
 | 
						||
func DiscardDecimal(value decimal.Decimal, discardDigits int32) decimal.Decimal {
 | 
						||
	// 如果 discardDigits 小于 0,直接返回原值
 | 
						||
	if discardDigits < 0 {
 | 
						||
		return value
 | 
						||
	}
 | 
						||
 | 
						||
	// 获取当前值的小数位数
 | 
						||
	currentPrecision := value.Exponent() * -1
 | 
						||
 | 
						||
	// 获取整数部分
 | 
						||
	integerPart := value.Truncate(0)
 | 
						||
 | 
						||
	// 如果小数位数超过一位且小于两位
 | 
						||
	if currentPrecision > 1 && currentPrecision < 2 {
 | 
						||
		// 如果有整数部分,截断一位小数
 | 
						||
		if !integerPart.IsZero() {
 | 
						||
			return value.Truncate(currentPrecision - 1)
 | 
						||
		}
 | 
						||
		// 如果没有整数部分,按正常流程处理
 | 
						||
	}
 | 
						||
 | 
						||
	// 如果小数位数只有一位
 | 
						||
	if currentPrecision == 1 {
 | 
						||
		// 如果有整数部分,返回整数部分
 | 
						||
		if !integerPart.IsZero() {
 | 
						||
			return integerPart
 | 
						||
		}
 | 
						||
		// 如果没有整数部分,保持原数据不变
 | 
						||
		return value
 | 
						||
	}
 | 
						||
 | 
						||
	// 如果小数位数超过两位,按正常流程处理
 | 
						||
	if currentPrecision > discardDigits {
 | 
						||
		precision := currentPrecision - discardDigits
 | 
						||
		return value.Truncate(precision)
 | 
						||
	}
 | 
						||
 | 
						||
	return value
 | 
						||
}
 |