首页 > 后端开发 > Golang > 如何在 Go 中打印固定宽度和最大有效位数的 Float64 数字?

如何在 Go 中打印固定宽度和最大有效位数的 Float64 数字?

Barbara Streisand
发布: 2024-12-04 01:47:10
原创
626 人浏览过

How to Print Float64 Numbers in Go with Fixed Width and Maximum Significant Digits?

打印具有固定宽度和有效数字的 Float64 数字

假设您需要在固定宽度为 12 个字符的表格中打印 float64 数字以及最大可能的有效数字位数。请考虑以下示例:

fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119"
fmt.Printf("%12.6g\n", 0.1234567890123)        //"    0.123457"
fmt.Printf("%12.6g\n", 123456789012.0)         //" 1.23457e+11"
登录后复制

如您所见,带有 .6g 格式说明符的默认 fmt.Printf 函数可能会截断有效数字或使用科学记数法,从而导致精度损失。有没有办法使用标准库函数来实现我们想要的格式?

自定义格式来救援

没有一个简单的标准库函数可以完全满足我们的要求。但是,我们可以开发一个自定义格式化函数,将所需的宽度和最大有效数字考虑在内。我们的处理方法如下:

  1. 检查数字是否大于或等于 1e12,因为这是正则形式和科学记数法之间的转折点。
  2. 对于正则形式,确定适合所需宽度的小数位数。使用 Sprintf 相应地构造格式字符串来指定宽度和精度。
  3. 对于科学记数法,检查指数的宽度(例如 e 1、e 10、e 100)并计算分数的最大可能精度剩余宽度内的部分。

这是一个示例实现Go:

import (
    "fmt"
)

func format12(x float64) string {
    if x >= 1e12 {
        exp := fmt.Sprintf("%.g", x)
        return fmt.Sprintf("%%12.%dg", 12-len(exp))
    }
    s := fmt.Sprintf("%.0f", x)
    if len(s) == 12 {
        return s
    }
    return fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
}
登录后复制

使用各种 float64 值测试此函数会产生以下输出:

0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119
登录后复制

这演示了如何以固定宽度打印 float64 数字,并具有最大可能的有效数量使用自定义格式的数字。

以上是如何在 Go 中打印固定宽度和最大有效位数的 Float64 数字?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板