记一次Go fmt.Sprintf转换float64错误

在Go项目中开发中尽量不要使用fmt.Sprintf将其它格式转换为String

使用fmt.Sprintf时需要注意如果使用%v, %+v, 超过100W会转换成科学计数法

func main() {
    var (
        fs = []float64{}
    )
    fs = append(fs, 10000)
    fs = append(fs, 99999)
    fs = append(fs, 65536)
    fs = append(fs, 100000)
    fs = append(fs, 999999)
    fs = append(fs, 1000000)
    for _, i2 := range fs {
        sprintf := fmt.Sprintf("f---%.f", i2)
        fmt.Printf("%+v \n", sprintf)
        sprintf = fmt.Sprintf("v--%v", i2)
        fmt.Printf("%+v \n", sprintf)
        sprintf = fmt.Sprintf("+v--%+v", i2)
        fmt.Printf("%+v \n", sprintf)
        fmt.Println("\n")
    }
}

f---10000 
v--10000 
+v--10000 

f---99999 
v--99999 
+v--99999 

f---65536 
v--65536 
+v--65536 

f---100000 
v--100000 
+v--100000 

f---999999 
v--999999 
+v--999999 

f---1000000 
v--1e+06 
+v--1e+06 

建议:

func FormatFloat(f float64, fmt byte, prec, bitSize int) string {
    return string(genericFtoa(make([]byte, 0, max(prec+4, 24)), f, fmt, prec, bitSize))
}
f: 传入的float数字
fmt:  如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数, 
如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分)
  'b' (-ddddp±ddd,二进制指数)
  'e' (-d.dddde±dd,十进制指数)
  'E' (-d.ddddE±dd,十进制指数)
  'f' (-ddd.dddd,没有指数)
  'g' ('e':大指数,'f':其它情况)
  'G' ('E':大指数,'f':其它情况)
prec:精度(数字部分的长度,不包括指数部分)
bitSize:指定浮点类型(32:float32、64:float64)

golang 中strconv包用法

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、数据类型转换 https://studygolang.com/articles/10838 package m...
    蓓蓓的万能男友阅读 1,104评论 0 1
  • Notes Section 2, Program Structure nested block in if-els...
    keysaim阅读 1,177评论 0 1
  • 编写和优化Go代码 本文档概述了编写高性能Go代码的最佳实践。 虽然有些讨论会提高单个服务的速度(通过缓存等),但...
    freelang阅读 2,254评论 0 4
  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
    皮皮v阅读 1,122评论 0 3
  • 第一章五个程序 都很好!但是初学编程/没有其他语言基础的不容易看懂。 记一遍不熟悉的东西: who = strin...
    暗黑破坏球嘿哈阅读 1,444评论 0 10