Java 将字符串转换为double总是给我错误的表示

Java 将字符串转换为double总是给我错误的表示,java,string,double,Java,String,Double,我想使用double.parsedouble方法将此字符串“0.00071942446044”转换为double,但它总是给出这个答案7.1942446044E-4 有没有办法将其转换为double,但保留与字符串中相同的数字?您可以使用新的BigDecimal(myString),这是不同的,但将保留相同的表示形式。它为不同的数学运算提供了API,但比使用双精度进行算术运算要慢。尽管两个数字完全相同,但您可以使用DecimalFormat以自己喜欢的方式操作格式,仅用于演示目的。以下是一个例子

我想使用
double.parsedouble
方法将此字符串
“0.00071942446044”
转换为double,但它总是给出这个答案
7.1942446044E-4


有没有办法将其转换为double,但保留与字符串中相同的数字?

您可以使用
新的BigDecimal(myString)
,这是不同的,但将保留相同的表示形式。它为不同的数学运算提供了API,但比使用双精度进行算术运算要慢。

尽管两个数字完全相同,但您可以使用DecimalFormat以自己喜欢的方式操作格式,仅用于演示目的。以下是一个例子:

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)); 
结果是:

double: 7.1942446044E-4
formatted: 0.00071942446044

请注意,小数点后的#数与您的示例完全相同

这只是显示数字的另一种方式。做了合理的工作,准确地解释了它

如果只想以相同的格式打印,可以使用
printf
String.format

打印
0.000719

System.out.printf("%f\n", Double.parseDouble("0.00071942446044"));
打印
0.00071942446044
:(使用硬编码精度,这可能不太理想)

还要注意的是,数字不是以数字的形式存储的,因此对于浮点类型(
float
double
)(虽然
double
,正如您所看到的,可以处理这个数量的数字),您将无法获得精确的大精度表示。注意如果使用
浮点
,会发生什么:

打印
7.1942444

System.out.printf("%.7f\n", Float.parseFloat("7.1942446"));
类似的测试用例(打印
7.1942446044352310


如果您想要更高的精度(显然是以内存和速度为代价的),那么应该使用
BigDecimal

您似乎认为
double
“知道”字符串表示法。它不是——它只是一个值。如果要以特定方式格式化,则需要显式执行。
7.1942446044E-4
0.00071942446044
是相同的
double
。请看@LutzHorn,你的意思是,如果我将这些值放入数组中,并对该数组进行比较,比较结果将是正确的??只要高兴最右边的数字恰好相同-
double
既不精确,也不完全反映以10为底的符号(500*0.2不是100.0).如果我将这个数字0.01223021582736与7.1942446044E-4进行比较,它会得出0.01223021582736更大???实际上我用这种方法来存储文件中的数字。Double的分数部分空间有限(52位),BigDecimal没有限制(java内存除外)并提供高精度的数学运算,但请记住,我需要将这些数字存储在多维双数组中,以便对其执行一些算术运算。如果需要高精度,可以创建
BigDecimal[][]
数组,如果您需要良好的输出,您可以使用下面答案中建议的格式。我的问题是:如果我将此数字0.01223021582736与7.1942446044E-4进行比较,则会得出0.01223021582736更大???,因此,当我进行算术运算和比较或对这些数字求和时,答案将是正确的??是,0.01与1 x 10^-2完全相同。所以任何算术运算对两个数字都是一样的。谢谢你的评论。
System.out.printf("%.7f\n", Float.parseFloat("7.1942446"));
System.out.printf("%.16f\n", Double.parseDouble("7.1942446044352312"));