美文网首页
记一次Go fmt.Sprintf转换float64错误

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

作者: Twenty_ | 来源:发表于2020-03-10 12:14 被阅读0次

    在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包用法

    相关文章

      网友评论

          本文标题:记一次Go fmt.Sprintf转换float64错误

          本文链接:https://www.haomeiwen.com/subject/klcwdhtx.html