使用Go我正在尝试找到将浮点数格式化为字符串的“最佳”方法。我找了一些例子但是找不到任何具体回答我的问题的东西。我想要做的就是使用“最佳”方法将浮点数格式化为字符串。小数位数可能会有所不同,但是已知(例如,2或4或零)。 我想要实现的一个例子如下。 基于以下示例我应该使用 fmt.Sprintf() 要么 strconv.FormatFloat() 要么 别的什么? 并且,每个的正常用法和每个之间的差异是什么?
我也不明白在下面使用32或64的重要性当前有32:
strconv.FormatFloat(float64(fResult), 'f', 2, 32)
示例:
package main
import (
"fmt"
"strconv"
)
func main() {
var (
fAmt1 float32 = 999.99
fAmt2 float32 = 222.22
)
var fResult float32 = float32(int32(fAmt1*100) +int32(fAmt2*100)) / 100
var sResult1 string = fmt.Sprintf("%.2f", fResult)
println("Sprintf value = " + sResult1)
var sResult2 string = strconv.FormatFloat(float64(fResult), 'f', 2, 32)
println("FormatFloat value = " + sResult2)
}
答案 0 :(得分:15)
fmt.Sprintf
和strconv.FormatFloat
都使用相同的字符串格式例程,因此应该给出相同的结果。
如果数字格式化的精度是可变的,那么使用FormatFloat
可能更容易,因为它避免了像Sprintf
那样构造格式字符串的需要。如果它永远不会改变,那么你可以使用它们。
FormatFloat
的最后一个参数控制值的舍入方式。来自文档:
它绕过了 结果假设原始是从浮点获得的 bitSize位的值(float32为32,float64为64)
因此,如果您使用示例代码中的float32
值,则传递32
是正确的。
答案 1 :(得分:0)
您将使用Go 1.12(2019年2月)和项目cespare/ryu
,这是strconv的更快替代方案:
Ryu 是Ryu的Go实现,Ryu是一种将浮点数转换为字符串的快速算法。
它是Ulf Adams's C library的相当直接的Go翻译。
strconv.FormatFloat
延迟为bimodal,这是因为不常采用的慢速路径要贵几个数量级(issue 15672)。Ryu算法需要几个查找表。
乌尔夫·亚当斯(Ulf Adams)的C库实现了大小优化(RYU_OPTIMIZE_SIZE
),可大大减少float64
表的大小,以换取更多的CPU成本。对于一小部分输入,Ryu给出的值与
strconv
的最后一位给出的值不同。
这是由于strconv
:issue 29491中的错误所致。
Go 1.12可能会或可能不会直接在strconv中包含该新实现,但是如果没有,则可以使用此项目进行更快的转换。