数字12.000001不能完全以实际格式表示。存储的值为12.0000009999999992515995472786016762256622314453125。问题是如何用语言准确地打印出来呢?
我尝试了这些方法:
double a = 12.000001;
System.out.println("- " + a);
System.out.println(String.format("%%f %f", a));
System.out.println(String.format("%%.20f %.20f", a));
System.out.println(String.format("%%.60f %.60f", a));
System.out.println(String.format("%%g %g", a));
System.out.println(String.format("%%.20g %.20g", a));
System.out.println(String.format("%%.60g %.60g", a));
事实证明,准确打印是不可能的:
- 12.000001 %f 12.000001 %.20f 12.00000100000000000000 %.60f 12.000001000000000000000000000000000000000000000000000000000000 %g 12.0000 %.20g 12.000001000000000000 %.60g 12.0000010000000000000000000000000000000000000000000000000000
PS为什么需要这个?例如用于调试。或者编写代码来说明问题中的问题当比较两个实数时,我们得到不同的结果。
您可以使用
BigDecimal
:有趣的是,它“知道”float(23 位,即大约7 位小数)和 double(52 位,大约15 位小数
String.format
)中有效位的数量,并且不会显示不重要的位。12.0000009999999992515995472786016762256622314453125
结果是15位数字12.0000010000000
。事实证明,没有不必要的零12.000001
。我们没有
BigDecimal
这个问题,因为...BigDecimal
完整存储数字的所有数字,并且在初始化 from 的情况下,double
对 中 表示的值进行精确转换,double
而不进行四舍五入。以下是文档对此的说明
BigDecimal(double)
:格式化时,您可以使用存储号码的所有可用数字。