go float和string直接的相互转换

作者: adm 分类: go 发布时间: 2023-06-11
// FormatFloat 将浮点数 f 转换为字符串值
// f:要转换的浮点数
// fmt:格式标记(b、e、E、f、g、G)
// prec:精度(数字部分的长度,不包括指数部分)
// bitSize:指定浮点类型(32:float32、64:float64)
//
// 格式标记:
// ‘b’ (-ddddp±ddd,二进制指数)
// ‘e’ (-d.dddde±dd,十进制指数)
// ‘E’ (-d.ddddE±dd,十进制指数)
// ‘f’ (-ddd.dddd,没有指数)
// ‘g’ (‘e’:大指数,‘f’:其它情况)
// ‘G’ (‘E’:大指数,‘f’:其它情况)
//
// 如果格式标记为 ‘e’,‘E’和’f’,则 prec 表示小数点后的数字位数
// 如果格式标记为 ‘g’,‘G’,则 prec 表示总的数字位数(整数部分+小数部分)
func FormatFloat(f float64, fmt byte, prec, bitSize int) string

参考

package main

import (
    "fmt"
    "strconv"
)

func main() {
    f := 100.12345678901234567890123456789
    fmt.Println(strconv.FormatFloat(f, 'b', 5, 32))
    // 13123382p-17
    fmt.Println(strconv.FormatFloat(f, 'e', 5, 32))
    // 1.00123e+02
    fmt.Println(strconv.FormatFloat(f, 'E', 5, 32))
    // 1.00123E+02
    fmt.Println(strconv.FormatFloat(f, 'f', 5, 32))
    // 100.12346
    fmt.Println(strconv.FormatFloat(f, 'g', 5, 32))
    // 100.12
    fmt.Println(strconv.FormatFloat(f, 'G', 5, 32))
    // 100.12
    fmt.Println(strconv.FormatFloat(f, 'b', 30, 32))
    // 13123382p-17
    fmt.Println(strconv.FormatFloat(f, 'e', 30, 32))
    // 1.001234588623046875000000000000e+02
    fmt.Println(strconv.FormatFloat(f, 'E', 30, 32))
    // 1.001234588623046875000000000000E+02
    fmt.Println(strconv.FormatFloat(f, 'f', 30, 32))
    // 100.123458862304687500000000000000
    fmt.Println(strconv.FormatFloat(f, 'g', 30, 32))
    // 100.1234588623046875
    fmt.Println(strconv.FormatFloat(f, 'G', 30, 32))
    // 100.1234588623046875
}

// ParseFloat 将字符串转换为浮点数
// s:要转换的字符串
// bitSize:指定浮点类型(32:float32、64:float64)
// 如果 s 是合法的格式,而且接近一个浮点值,
// 则返回浮点数的四舍五入值(依据 IEEE754 的四舍五入标准)
// 如果 s 不是合法的格式,则返回“语法错误”
// 如果转换结果超出 bitSize 范围,则返回“超出范围”
func ParseFloat(s string, bitSize int) (f float64, err error)

func main() {
    s := "0.12345678901234567890"
    f, err := strconv.ParseFloat(s, 32)
    fmt.Println(f, err)          // 0.12345679104328156
    fmt.Println(float32(f), err) // 0.12345679
    f, err = strconv.ParseFloat(s, 64)
    fmt.Println(f, err) // 0.12345678901234568
    value, err := strconv.ParseFloat(fmt.Sprintf("%.3f", 3.1415926), 64)
    fmt.Println(value, err) // 3.142
}

后面想了一下,感觉还是直接先转int在转float最方便,反正我的数据没有小数点。。。

return strconv.Itoa(int(num))

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!