Float.toString(value)似乎有任意的舍入点


执行Float.toString(68.1992069267325(时,我期望java返回68.19921。相反,我收到了68.1992。经过进一步调查,似乎取整点有点武断,而不是在5的边界(例如,我预计68.199205取整,68.19920499999取整(
> 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.199206926732568.1992070000000都不能精确地表示为float。两者都具有与68.1992相同的表示形式,因此这就是在两种情况下打印的内容。

您打印的一些实数很可能没有精确的浮点表示。

如果您关心的是给出实数的正确表示并定义四舍五入行为,那么您应该使用BigDecimal类。此类是专门为克服浮点表示的限制而设计的,因为它允许您定义任意精度的带符号十进制数。

使用String.format("%.06f", 68.1992069267325)

相关内容

  • 没有找到相关文章

最新更新