java - parseFloat() 与 parseDouble()

标签 java string floating-point double

我正在尝试使用下面的代码将字符串转换为 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/

相关文章:

python - 使用python查找文件名

C 字符串声明

.net - 截断小数不四舍五入

go - 使用 time.Unix() 从 float 解析带小数的 unix 时间戳?

floating-point - 128 位 "long-float"有用吗?

Java:使用随机字符创建长度为X的字符串

java - 如何设置不按字节边界划分的位值

java - WildFly - 如何查看部署

java - Red 5 适用于所有演示应用程序,但当我尝试添加自己的应用程序时,它会崩溃。这是怎么回事?

ruby - 单引号内的插值