go浮点数截取n位数(四舍五入或舍弃尾数)并舍弃后面的0值

日期 2023年05月05日 18:34

分类 Golang

标签 golang 浮点数

浏览 8135

字数统计: 1289(字)

文章目录

formatFloat函数 - 将浮点数表示为字符串并返回

func FormatFloat(f float64, fmt byte, prec, bitSize int) string
  • bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。

  • fmt表示格式:‘f’(-ddd.dddd)、‘b’(-ddddp±ddd,指数为二进制)、‘e’(-d.dddde±dd,十进制指数)、‘E’(-d.ddddE±dd,十进制指数)、‘g’(指数很大时用’e’格式,否则’f’格式)、‘G’(指数很大时用’E’格式,否则’f’格式)。

  • prec控制精度(排除指数部分):对’f'、‘e’、‘E’,它表示小数点后的数字个数;对’g'、‘G’,它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。

golang浮点数截取尾数有两种模式:

1.保留n尾数并四舍五入

// FormatFloatRound 强制舍弃尾数(四舍五入,舍弃后面的0值)
func FormatFloatRound(num float64, n int) float64 {
	// 默认乘1
	d := float64(1)
	if decimal > 0 {
		// 10 的 n 次方
		d = math.Pow10(n)
	}
	// 保留 n 位小数:  math.Round作用就是返回浮点数的整数部分(四舍五入)
	f2 := math.Round(f*d) / d
	// 舍弃后面的0值: -1 参数表示保持原小数位数
	res := strconv.FormatFloat(math.Round(num*d)/d, 'f', -1, 64)
	// 转换成float64
	last, _ := strconv.ParseFloat(res, 64)
	return last
}

2.直接截取n尾数并舍弃后面的数字

// TruncFloat 强制舍弃尾数(直接舍弃尾数,舍弃后面的0值)
func TruncFloat(f float64, n int) float64 {
	// 默认乘1
	d := float64(1)
	if n > 0 {
		// 10 的 n 次方
		d = math.Pow10(n)
	}
	// 截断 n 位小数:  math.trunc作用就是返回浮点数的整数部分
	f2 := math.Trunc(f*d) / d
	// 舍弃后面的0值: -1 参数表示保持原小数位数,千万要注意,如果你指定了位数就会四舍五入了
	fs := strconv.FormatFloat(f2, 'f', -1, 64)
	// 转换成float64
	f3, _ := strconv.ParseFloat(fs, 10)
	return f3
}