我正在尝试使用来获得一些具有相同宽度格式的浮点数fmt.Printf()
。
例如,给定float值0.0606060606060606、0.3333333333333333、0.05、0.4和0.1818181818181818,我希望将每个值html" target="_blank">格式化为10个符文:
0.06060606
0.33333333
0.05
0.4
0.18181818
但我不知道它是如何完成的。文档说
对于浮点值,width设置字段的最小宽度,而precision设置小数点后的位数(如果适用),但%g
/%G除外,它设置位数的总数。例如,给定123.45,格式%6.2f打印123.45,而%.4g打印123.5。%e和%f的默认精度为6;对于%g,它是唯一标识该值所需的最少位数。
因此,如果我使用%f
较大的数字将不适合10个字符的约束,因此%g
是必需的。最小宽度为10是%10g
,最大宽度为9位(点为+1)%.9g
,但是将它们组合起来%10.9g
并不像我期望的那样
0.0606060606
0.333333333
0.05
0.4
0.181818182
我怎么得到10个符文的字符串,其他11个符文的字符串和其他12个符文的字符串?
特别是似乎%.9g
总共不产生9位数字。参见例如:http :
//play.golang.org/p/ie9k8bYC7r
首先,我们需要正确理解文档:
width设置字段的最小宽度,而precision设置小数点后的位数(如果适用),除了%g /%G以外,它设置位数的总数。
这条线路是语法正确的,但 它 在这句话中的最后一部分是真的困惑:它实际上指 的精度 ,而不是 宽度 。
因此,让我们看一些示例:
123.45
12312.2
1.6069
0.6069
0.0006069
然后像打印一样fmt.Printf("%.4g")
,它可以给您
123.5
1.231e+04
1.607
0.6069
0.0006069
仅4 位数字,不包括所有小数点和指数 。但是,等等,最后两个示例会怎样?您是在跟我开玩笑吗,位数不超过5位吗?
这是打印过程中令人困惑的部分: 前导0 不会被算作数字,并且 当少于4个零时也不会缩水 。
让我们使用以下示例查看0行为:
package main
import "fmt"
func main() {
fmt.Printf("%.4g\n", 0.12345)
fmt.Printf("%.4g\n", 0.012345)
fmt.Printf("%.4g\n", 0.0012345)
fmt.Printf("%.4g\n", 0.00012345)
fmt.Printf("%.4g\n", 0.000012345)
fmt.Printf("%.4g\n", 0.0000012345)
fmt.Printf("%.4g\n", 0.00000012345)
fmt.Printf("%g\n", 0.12345)
fmt.Printf("%g\n", 0.012345)
fmt.Printf("%g\n", 0.0012345)
fmt.Printf("%g\n", 0.00012345)
fmt.Printf("%g\n", 0.000012345)
fmt.Printf("%g\n", 0.0000012345)
fmt.Printf("%g\n", 0.00000012345)
}
和输出:
0.1235
0.01235
0.001234
0.0001234
1.234e-05
1.234e-06
1.235e-07
0.12345
0.012345
0.0012345
0.00012345
1.2345e-05
1.2345e-06
1.2345e-07
因此,您可以看到,当少于4个前导0时,它们将被计数,而如果超过4个,则会缩水。
好的,接下来是width
。在文档中,width
仅指定最小宽度, 包括小数位和指数
。这意味着,如果您的位数多于width
指定的位数,它将超出宽度。
请记住,宽度将被视为最后一步,这意味着它 首先 需要 满足precision字段 。
让我们回到您的情况。您指定%10.9g
,表示您希望总位数为9(不包括前导号)0
,并且最小宽度应10
包括小数位和指数,并且精度应该优先。
0.0606060606060606
:取9位数字且不带0会给你0.0606060606
,因为它已经是12宽度了,所以它通过了最小宽度10;
0.3333333333333333
:取9位数字且不带前导0会给您0.333333333
,因为它已经是11宽度,所以它通过了最小宽度10;
0.05
:取9位数字且不带前导0会给您0.05
,因为它小于宽度10,它将再填充6个宽度以获得10的宽度;
0.4
:同上;
0.1818181818181818
:取9位数字,没有前导0会给你0.181818182
与 舍入
,因为它已经是11宽,它传递的10分钟宽度。
因此,这解释了为什么您得到有趣的打印。
问题内容: 我有一个仅包含2个字段的表。该表具有由这两个字段形成的复合PK。 使用Netbeans从数据库创建实体bean时,不会像其他具有两个以上字段的表那样自动创建实体bean。 所以我想我需要自己创建实体bean。创建此实体bean的最佳实践是什么?是否必须包含对象? 问题答案: 我不使用NetBeans,因此我不能说任何有关其映射工具的信息。 要映射组合键,有两个选项。您可以 用PK字段定
问题内容: Go 支持以数千个逗号输出数字吗? 输出,我可以指定输出什么格式呢? 这些文档似乎没有提到逗号,而且我也无法立即在源代码中看到任何内容。 问题答案: fmt打印动词均不支持数千个分隔符。
我在elasticsearch(版本:5.1.1)中有一个现有的索引,其中有一些文档索引。索引中的映射(例如硬件)有一个A字段,如下所示: 我想用analyzer向其添加一个字段,如下所示:“BiosSerialNumber”:{“Type”:“Keyword”,“Fields”:{“Suffix”:{“Type”:“Text”,“analyzer”:“ABC_Analyzer”}}} “abc_
我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个
问题内容: 在对fielddata与doc_values进行的一些实验中,我遇到了一个奇怪的情况。在我以前的映射中,我根本没有使用doc值。在新的映射中,我已添加到映射中的所有字段,但分析的字符串字段和布尔值(直到2.0才受支持)除外。 因此,详细而言,这是我的处理方式: 重新索引所有数据之前,我重新启动了ES 1.7集群,并使用排序,聚合和脚本字段运行查询以“预热”字段数据缓存。然后,我询问端点
问题内容: 我有一个包含三个字段(所有字符串类型)的“报告”对象列表- 我有一个排序代码,就像 由于某种原因,我没有排序顺序。一个建议在字段之间放置空格,但是为什么呢? 你认为代码有什么问题吗? 问题答案: 你认为代码有什么问题吗? 是。为什么在比较它们之前将三个字段加在一起? 我可能会做这样的事情:(假设字段按照你希望对其进行排序的顺序)