String to float / double Parsing

时间:2016-05-19 07:46:35

标签: java string double string-parsing

当我尝试将以下字符串解析为float并进入double:

String abc = "8.40";
System.out.println("Double Value: " + Double.parseDouble(abc) * 100);
System.out.println("Float Value: " + Float.parseFloat(abc) * 100);

我得到两个不同的结果。

Double Value: 840.0
Float Value: 839.99994

但是当我尝试将float和double乘以10或1000时使用相同的代码时,我得到了相似的结果。

String abc = "8.40";
System.out.println("Double Value: " + Double.parseDouble(abc) * 10);
System.out.println("Float Value: " + Float.parseFloat(abc) * 10);

我得到两个类似的结果。

Double Value: 84.0
Float Value: 84.0

当我尝试这个时:

String abc = "8.40";
System.out.println("Double Value: " + Double.parseDouble(abc) * 1000);
System.out.println("Float Value: " + Float.parseFloat(abc) * 1000);

我得到两个类似的结果。

Double Value: 8400.0
Float Value: 8400.0

2 个答案:

答案 0 :(得分:3)

这样可以正常工作:

System.out.println("Float Value: "+Math.round((float)Float.parseFloat(abc)*100));

因此,这是因为doublefloat的不同表示,或更准确地说,是float的IEEE-754舍入。阅读它here

float的范围和精度都较小,因此当你有记忆时(double会更好)。 但是,他们都是邪恶的!在Java中有一个更好的选项BigDecimal,你应该使用它,因为它没有大小问题,今天我们有强大的计算机,所以我们在处理大量数据时不会遇到内存和速度方面的问题需要最大精度的十进制数。例如,如果您处理处理大量金钱交易的软件,则必须使用BigDecimal

答案 1 :(得分:2)

double确实比float具有更高的精度,但两者都存在同样的问题:它们的值可能不准确,并且它们都有一些(小)舍入错误它们的最低有效位(LSB)。这在您获得的第一个结果中很明显:float值不准确。但是,当您乘以10或1000时,LSB将从结果中被丢弃,因此您可以得到floatdouble的正确答案。

相关问题