当前位置: 首页 > 面试题库 >

是否有任何标准库可将float64转换为具有最大有效位数的固定宽度的字符串?

东方震博
2023-03-14
问题内容

假设要在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"

我们首选0.1234567890而不是“ 0.123457”,我们损失6个有效数字。
我们宁愿123456789012而不是“ 1.23457e + 11”,我们输掉6个有效数字。

是否有任何标准库可以转换float64string具有最大有效位数的固定宽度?提前致谢。


问题答案:

基本上,您有2种输出格式:科学计数法或常规格式。这两种格式之间的转折点是1e12

因此,如果可以分支x >= 1e12。在两个分支中,您都可以使用0个小数位数进行格式化,以查看数字的长度,因此您可以计算12个宽度中可以容纳多少个小数位数,从而可以使用计算出的精度构造最终的格式字符串

预检查在科学记数法需要太多(%g),因为指数的宽度可以变化(例如e+1e+10e+100)。

这是一个示例实现。这是入门,但这并不意味着要处理所有情况,它也不是最有效的解决方案(但是相对简单,可以完成工作):

// format12 formats x to be 12 chars long.
func format12(x float64) string {
    if x >= 1e12 {
        // Check to see how many fraction digits fit in:
        s := fmt.Sprintf("%.g", x)
        format := fmt.Sprintf("%%12.%dg", 12-len(s))
        return fmt.Sprintf(format, x)
    }

    // Check to see how many fraction digits fit in:
    s := fmt.Sprintf("%.0f", x)
    if len(s) == 12 {
        return s
    }
    format := fmt.Sprintf("%%%d.%df", len(s), 12-len(s)-1)
    return fmt.Sprintf(format, x)
}

测试它:

fs := []float64{0, 1234.567890123, 0.1234567890123, 123456789012.0, 1234567890123.0,
    9.405090880450127e+9, 9.405090880450127e+19, 9.405090880450127e+119}

for _, f := range fs {
    fmt.Println(format12(f))
}

输出(在Go Playground上尝试):

0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119


 类似资料:
  • 有没有一种方法可以直接将集合转换为字符串(而不需要先将集合转换为数组)?我看过Mozilla的文档,我觉得这可能是一种方法。我就是这么做的:

  • 问题内容: 我试图找到一种解析文件的方法,该文件包含固定宽度的线。例如,前20个字符代表一列,从21:30开始代表另一列,依此类推。 假设该行包含100个字符,将行解析为多个组件的有效方法是什么? 我可以每行使用字符串切片,但是如果行很大,这会有点难看。还有其他快速方法吗? 问题答案: 由于Python标准库的模块是用C编写的,因此使用它非常容易而且非常快捷。 这是可以用来完成您想要的事情的方法。

  • 我有一个与PHP链接的JavaScript AJAX。PHP有以下代码: 它的输出将是一个字符串: 我想用这些元素创建一个JavaScript数组: 是否有预定义的函数要使用?你有解决办法吗?

  • 问题内容: 将单个char传递给需要CharSequence的方法的最有效方法是什么? 这就是我得到的: 根据此处给出的答案,在输入为字符数组的情况下,这是一种明智的做法。我想知道是否可以在单字符案例中应用偷偷摸摸的快捷方式。 问题答案: textView.setText(String.valueOf(c))

  • 问题内容: 有谁知道PHP的健壮(和防弹)is_JSON函数代码片段?我(显然)遇到一种情况,我需要知道字符串是否为JSON。 嗯,也许通过JSONLint请求/响应来运行它,但这似乎有点过头了。 问题答案: 如果您使用内置的PHP函数,则 返回最后一个错误(例如, 当您的字符串不是JSON时)。 无论如何通常都会返回。

  • 问题内容: 我想使用JSON发送大字节数组启发了我,为了减少开销,我想使用base128编码(实际上可以产生有效的json字符串)。但不幸的是,我无法找到一些在JS中进行转换的过程。我将发布过程作为对此问题的答案,但是可能是某人的过程更短,或者可能是在JSON中有效发送二进制数据的更好的主意。 问题答案: ES6: 编码 解码 我在这里嵌入功能-这里。这里的掩盖思想是将字节数组转换为位数组,然后将