如何使用Go将浮点数格式化为字符串

时间:2013-09-23 03:27:19

标签: go

使用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)

}

2 个答案:

答案 0 :(得分:15)

fmt.Sprintfstrconv.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的最后一位给出的值不同。
  这是由于strconvissue 29491中的错误所致。

Go 1.12可能会或可能不会直接在strconv中包含该新实现,但是如果没有,则可以使用此项目进行更快的转换。