> println Float.toString(68.1992069267325)
> println Float.toString(68.1992070000000)
> println Float.toString(68.1992071000000)
> println Float.toString(68.1992072000000)
> println Float.toString(68.1992073000000)
> println Float.toString(68.1992074000000)
> println Float.toString(68.1992075000000)
> println Float.toString(68.1992076000000)
> println Float.toString(68.1992077000000)
> println Float.toString(68.1992078000000)
> println Float.toString(68.1992079000000)
> println Float.toString(68.1992079267325)
68.1992
68.1992
68.1992
68.1992
68.1992
68.19921
68.19921
68.19921
68.19921
68.19921
68.19921
68.19921
根据javadocs:
m或a的小数部分必须打印多少位数字?必须至少有一个数字来表示小数部分,除此之外,还必须有足够多的数字来唯一区分参数值和float类型的相邻值。也就是说,假设x是由这种方法对有限的非零自变量f产生的十进制表示所表示的精确数学值。那么f必须是最接近x的浮点值;或者,如果两个浮点值同样接近x,则f必须是其中之一,并且f的有效位的最低有效位必须为0。
这里需要记住的一点是,float
类型是实数数学概念的粗略近似。这种近似的一个奇特之处在于,并不是每个实数都有一个float
表示。
根据您的输出,我想68.1992069267325
和68.1992070000000
都不能精确地表示为float
。两者都具有与68.1992
相同的表示形式,因此这就是在两种情况下打印的内容。
您打印的一些实数很可能没有精确的浮点表示。
如果您关心的是给出实数的正确表示并定义四舍五入行为,那么您应该使用BigDecimal类。此类是专门为克服浮点表示的限制而设计的,因为它允许您定义任意精度的带符号十进制数。
使用String.format("%.06f", 68.1992069267325)