最近在项目中碰到很多次float转string,同时要求保留小数点后几位,并且去掉小数点后0的场景 虽然问题很简单,但是隔了挺久没处理这种场景就有些生疏了,自己也搜了一下,很多回答都不太满意。这里贴一下自己的做法,如果有更好的解决办法的话,还请多多指教 // 主要逻辑就是先乘,trunc之后再除回去,就达到了保留N位小数的效果 func FormatFloat(num float64, decimal int) string { // 默认乘1 d := float64(1) if decimal > 0 { // 10的N次方 d = math.Pow10(decimal) 在Go语言中,将浮点数转换为字符串并保留小数点后特定位数是一个常见的需求,特别是在数据格式化和输出时。本文将详细介绍一种在Go中实现此功能的完美解决方法,以及相关的浮点数处理技巧。 让我们看下提供的`FormatFloat`函数的实现: ```go func FormatFloat(num float64, decimal int) string { // 默认乘1 d := float64(1) if decimal > 0 { // 10的N次方 d = math.Pow10(decimal) } // math.trunc作用就是返回浮点数的整数部分 // 再除回去,小数点后无效的0也就不存在了 return strconv.FormatFloat(math.Trunc(num*d)/d, 'f', -1, 64) } ``` 这个函数的核心思想是通过将浮点数乘以10的N次方(N为保留的小数位数),然后使用`math.Trunc`函数截断多余的小数部分,最后再除以相同的10的N次方,以达到保留指定小数位的效果。这样可以避免小数点后多余的0。`strconv.FormatFloat`用于将结果转换为字符串。 此外,我们还可以使用Go的标准库`fmt.Sprintf`或`strconv.FormatFloat`配合不同的格式化选项来格式化浮点数。例如: 1. `fmt.Sprintf("%.2f", 123.123)`:这会保留2位小数,但可能会有小数点后无效的0。 2. `fmt.Sprintf("%g", 123.00)`:`%g`模式会自动去除小数点后的无效0,但无法保证保留固定位数。 3. `strconv.FormatFloat(a, 'g', -1, 64)`:与`%g`类似,适用于去除无效0,但同样无法控制小数位数。 对于更复杂的需求,如动态调整小数位数并确保精度,可以使用`ChangeNumber`函数,它将根据指定的小数位数截断浮点数的尾部: ```go func ChangeNumber(f float64, m int) string { n := strconv.FormatFloat(f, 'f', -1, 32) if n == "" { return "" } if m >= len(n) { return n } newn := strings.Split(n, ".") if len(newn) < 2 || m >= len(newn[1]) { return n } return newn[0] + "." + newn[1][:m] } ``` 这个函数将浮点数转换为字符串,然后根据指定的小数位数截断。返回字符串是因为在浮点数进行运算后,可能会损失精度,而字符串则能保持原始值不变。 总结起来,Go语言提供了多种方式来处理浮点数转字符串并保留小数点后特定位数的问题。`FormatFloat`函数提供了一种灵活且精确的解决方案,而`ChangeNumber`函数则适应了动态调整保留位数的需求。在实际编程中,我们可以根据具体情况选择合适的方法。在处理浮点数时,尤其是在涉及到精度要求较高的场景,应特别注意浮点数的运算特性,适时利用字符串来保持数值的精确性。
![](https://csdnimg.cn/release/download_crawler_static/13738429/bg1.jpg)
![application/pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsm](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![vi](https://img-home.csdnimg.cn/images/20210720083646.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 6
- 资源: 942
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0