lancet icon indicating copy to clipboard operation
lancet copied to clipboard

formatter下的DecimalBytes非整数

Open imyuanandyou opened this issue 7 months ago • 6 comments

DecimalBytes : 返回十进制标准(以 1000 为基数)下的可读字节单位字符串。precision 参数指定小数点后的位数,默认为 4。

根据描述precision参数为控制小数点的位数,但某些情况下会变成科学计数法 例如

// 测试6000万这个数
formatter.DecimalBytes(61812496)
// 61.812MB

formatter.DecimalBytes(61812496, 2)
// 61.8MB

formatter.DecimalBytes(61812496, 1)
// 62MB

formatter.DecimalBytes(61812496, 0)
// 6e+01MB


//再测试4亿这个数
formatter.DecimalBytes(401000000)
//401MB

formatter.DecimalBytes(4010000, 0)
//4e+02MB

最后我的解决办法,不知道合不合理 缺点就是在401.00000MB整数的时候还是会带上小数位数,不知道如何优化了。但不会出现科学计数法的表示,可以接受

func DecimalBytes(size float64, precision ...int) string {
	p := 5
	if len(precision) > 0 {
		p = precision[0]
	}
	size, unit := calculateByteSize(size, 1000.0, decimalByteUnits)
	position := fmt.Sprintf("%%.%df", p)
	return fmt.Sprintf(position+"%s", size, unit)
}



// 测试6000万这个数
utils.DecimalBytes(61812496)
// 61.81250MB

utils.DecimalBytes(61812496, 2)
// 61.81MB

utils.DecimalBytes(61812496, 1)
// 61.8MB

utils.DecimalBytes(61812496, 0)
// 62MB


//再测试4亿这个数
utils.DecimalBytes(401000000)
//401.00000MB

utils.DecimalBytes(4010000, 0)
//4MB

imyuanandyou avatar Jul 27 '24 18:07 imyuanandyou