【问题标题】:How to format floating point numbers into a string using Go如何使用 Go 将浮点数格式化为字符串
【发布时间】:2013-09-27 21:12:19
【问题描述】:

使用 Go,我试图找到将浮点数格式化为字符串的“最佳”方式。我一直在寻找示例,但是我找不到任何可以专门回答我的问题的东西。我要做的就是使用“最佳”方法将浮点数格式化为字符串。小数位数可能会有所不同,但将是已知的(例如 2 或 4 或零)。 下面是我想要实现的一个示例。

根据下面的示例,我应该使用fmt.Sprintf()strconv.FormatFloat() 还是其他?

而且,每个的正常用法和它们之间的区别是什么?

我也不明白在以下当前有 32 的情况下使用 32 或 64 的意义:

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)

}

【问题讨论】:

标签: go


【解决方案1】:

fmt.Sprintfstrconv.FormatFloat 都使用相同的字符串格式化例程,因此应该给出相同的结果。

如果数字应该被格式化的精度是可变的,那么使用FormatFloat 可能更容易,因为它避免了像使用Sprintf 那样构造格式字符串的需要。如果它永远不会改变,那么你可以使用任何一个。

FormatFloat 的最后一个参数控制值的舍入方式。来自文档:

它圆了 结果假设原始数据是从浮点数获得的 bitSize 位的值(float32 为 32,float64 为 64)

因此,如果您在示例代码中使用 float32 值,那么传递 32 是正确的。

【讨论】:

    【解决方案2】:

    您将在 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 中包含该新实现,但如果没有,您可以使用此项目进行更快的转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      相关资源
      最近更新 更多