我们如何将 float64 类型截断为特定精度?

新手上路,请多包涵
package main

import (
    "fmt"
    "strconv"
    )

func main() {
    k := 10/3.0
    i := fmt.Sprintf("%.2f", k)
    f,_ := strconv.ParseFloat(i, 2)
    fmt.Println(f)
}

我不得不编写上面的程序来将 go float64 变量的精度降低到 2。在这种情况下,我同时使用了 strconv 和 fmt。有没有其他逻辑方法可以做到这一点?

原文由 George Thomas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 846
2 个回答

你不需要任何额外的代码……它就像

import (
    "fmt"
)

func main() {
    k := 10 / 3.0
    fmt.Printf("%.2f", k)
}

测试代码

原文由 Baba 发布,翻译遵循 CC BY-SA 3.0 许可协议

下面的代码应该适用于许多简单的用例,这些用例具有相对较小的数字和较小的精度输入。但是,它可能不适用于某些用例,因为数字溢出了 float64 数字的范围,以及 IEEE-754 舍入错误( 其他语言也有此问题)。

如果您关心使用更大的数字或需要更高的精度,以下代码可能无法满足您的需求,您应该使用帮助程序库(例如 https://github.com/shopspring/decimal )。

我从其他地方获取了一个单行轮函数,还制作了依赖于 round() 的 toFixed():

 func round(num float64) int {
    return int(num + math.Copysign(0.5, num))
}

func toFixed(num float64, precision int) float64 {
    output := math.Pow(10, float64(precision))
    return float64(round(num * output)) / output
}

用法:

 fmt.Println(toFixed(1.2345678, 0))  // 1
fmt.Println(toFixed(1.2345678, 1))  // 1.2
fmt.Println(toFixed(1.2345678, 2))  // 1.23
fmt.Println(toFixed(1.2345678, 3))  // 1.235 (rounded up)

原文由 David Calhoun 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题