【问题标题】:Format a float to n decimal places and no trailing zeros将浮点数格式化为 n 位小数且没有尾随零
【发布时间】:2022-05-11 16:14:03
【问题描述】:

我想显示一个包含整个整数部分和小数部分最多两位小数的浮点数,不带尾随零。

http://play.golang.org/p/mAdQl6erWX:

// Desired output: 
// "1.9"
// "10.9"
// "100.9"

fmt.Println("2g:")
fmt.Println(fmt.Sprintf("%.2g", 1.900)) // outputs "1.9"
fmt.Println(fmt.Sprintf("%.2g", 10.900)) // outputs "11"
fmt.Println(fmt.Sprintf("%.2g", 100.900)) // outputs "1e+02"

fmt.Println("\n2f:")
fmt.Println(fmt.Sprintf("%.2f", 1.900)) // outputs "1.90"
fmt.Println(fmt.Sprintf("%.2f", 10.900)) // outputs "10.90"
fmt.Println(fmt.Sprintf("%.2f", 100.900)) // outputs "100.90"

使用2g 格式化的问题是当整数增加数量级时它开始舍入。此外,它有时会显示带有e 的数字。

使用2f 格式化的问题是它会显示尾随零。我可以编写一个删除尾随零的后处理函数,但我宁愿使用Sprintf 来执行此操作。

这可以使用Sprintf 以通用方式完成吗?
如果没有,有什么好的方法可以做到这一点?

【问题讨论】:

  • %.Ng N 是总位数,而不是精度。不幸的是,我认为您不能仅使用 Sprintf 来实现您的要求。

标签: go floating-point-conversion


【解决方案1】:

strconv.FormatFloat(10.900, 'f', -1, 64)

这将导致10.9

-1 作为第三个参数告诉函数打印准确表示浮点数所需的最少数字。

请看这里:https://golang.org/pkg/strconv/#FormatFloat

【讨论】:

  • 这并没有严格解决他们的问题,因为他们想要2分的精度。
【解决方案2】:

不确定Sprintf,但要让它发挥作用。只需向右修剪,首先是0,然后是.

fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.900), "0"), ".")) // 100.9
fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.0), "0"), ".")) // 100

【讨论】:

    【解决方案3】:

    我使用下面的函数来达到同样的效果:

    //return 45.00 with "45" or 45.50 with "45.5"
    func betterFormat(num float32) string {
        s := fmt.Sprintf("%.4f", num)
        return strings.TrimRight(strings.TrimRight(s, "0"), ".")
    }
    

    【讨论】:

      【解决方案4】:

      使用下面的函数来格式化和控制位数。

      func FormatFloat(num float64, prc int) string {
          var (
              zero, dot = "0", "."
      
              str = fmt.Sprintf("%."+strconv.Itoa(prc)+"f", num)
          )
          
          return strings.TrimRight(strings.TrimRight(str, zero), dot)
      }
      

      这是一个例子:

      // Converts 18.24100100 to 18.24
      fmt.Println(FormatFloat(18.24100100, 2))
      

      【讨论】:

        猜你喜欢
        • 2011-01-27
        • 2011-07-08
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 1970-01-01
        • 2020-04-17
        • 2012-05-17
        • 1970-01-01
        相关资源
        最近更新 更多