操StackOverflow,操OpenAI。
好吧,我删除了之前的答案,因为它绝对是错误的(感谢@JohnKugelman 指出了这一点)。我认为转换为
float
会导致精度丢失,但事实并非如此。
根据 formatter 文档,以下是使用
%f
标志时会发生的情况:
幅度 m(参数的绝对值)的格式为 m 的整数部分,没有前导零,后跟 小数点分隔符后跟一位或多位小数位,表示 m.
m小数部分的结果位数等于精度。 如果没有指定精度则 默认值为 6
如果精度小于将出现的位数 返回的字符串中小数点后 分别为
Float.toString(float)
或 Double.toString(double)
,
那么该值将使用向上舍入算法进行舍入。
否则,可能会附加零以达到精度。这就是为什么你会得到不必要的零并削减数字。
文档建议使用
Float.toString(float)
或 Double.toString(double)
作为值的规范表示。
如果您想使用
System.out.printf(...);
,您只需将 %f
标志替换为 %s
- 在这种情况下,参数将被转换为字符串(结果是通过调用参数的 toString()
方法获得的,并且这就是你所需要的)。例如,您可以重写这一行:
System.out.printf(x + "\t\t%f\n", population);
如下:
System.out.printf("%d\t\t%s\n", x, population);
这将打印您的
population
的准确值。