我想 "0.00071942446044"
通过使用Double.parsedouble
方法将此字符串转换为双精度,但它总是给出这个答案7.1942446044E-4
有没有办法将其转换为双精度但保持与字符串中相同的数字?
您可以使用new BigDecimal(myString)
,这不一样,但会保持相同的表示。它提供了用于执行不同数学运算的 API,但比使用双精度数进行算术运算要慢。
Although both numbers are exactly the same, you could use DecimalFormat to manipulate the format in a way you like, only for presentation purpose. Here is an example:
String s = "0.00071942446044";
Double d = Double.parseDouble(s);
DecimalFormat df = new DecimalFormat("#.##############");
System.out.println("double: " + d);
System.out.println("formatted: " + df.format(d));
The out is:
double: 7.1942446044E-4
formatted: 0.00071942446044
Note that the number of # after decimal point is exactly the same as your example.
这只是显示数字的另一种方式。该文档做了一个合理的工作来准确地解释它。
如果您只是想以相同的格式打印它,您可以使用printf
或String.format
:
打印0.000719
:
System.out.printf("%f\n", Double.parseDouble("0.00071942446044"));
打印0.00071942446044
:(具有硬编码的精度,这可能不是主意)
System.out.printf("%.14f\n", Double.parseDouble("0.00071942446044"));
另请注意,数字不是以数字形式存储的,因此您不会获得浮点类型 (float
和double
) 的精确大精度表示(尽管double
,如您所见,可以处理这么多的数字)。注意如果你使用会发生什么float
:
打印7.1942444
:
System.out.printf("%.7f\n", Float.parseFloat("7.1942446"));
类似的测试用例double
:(打印7.1942446044352310
)
System.out.printf("%.16f\n", Double.parseDouble("7.1942446044352312"));
如果您想要更高的精度(显然是有代价的 - 内存和速度),您应该使用BigDecimal
.