我正在尝试使用下面的代码将字符串转换为 float 和 double ,但结果不同。
代码:
System.out.println(Float.parseFloat("120059389"));
System.out.println(Double.parseDouble("120059389"));
输出:
1.20059392E8
1.20059389E8
有人能解释一下为什么我在解析 float 和 double 中的字符串时得到不同的结果吗? float 和 double 的范围是多少?
最佳答案
这是因为您试图通过为 float
提供超出其处理能力的精度位数来解析它。 "ulp" (unit in last place) of a float
那个大是 8.0
,但是 "ulp" for a double
这么大还是相当小的。也就是说,在那个幅度上,最接近的可能 float
值相差 8
,但最接近的 double
值(更精确)相差很远更少。
System.out.println(Math.ulp(120059389f));
System.out.println(Math.ulp(120059389d));
这打印:
8.0
1.4901161193847656E-8
所以Float
解析器必须使用最接近120059389
真实值的float
,恰好是1.20059392E8
.
关于java - parseFloat() 与 parseDouble(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22970240/