字符串要 float/double 解析

String to float/double Parsing

当我尝试将以下字符串解析为浮点数和双精度数时:

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

这会很好用:

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

因此,发生这种情况是因为 doublefloat 的不同表示,或者更准确地说,关于 float 的 IEEE-754 舍入。阅读它 here

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

确实doublefloat更精确,但是他们都遇到了同样的问题:他们的值可能不准确,他们都有一些(小的)舍入在他们的最低有效位(LSB)的错误。这在您得到的第一个结果中很明显:float 值不准确。但是,当您乘以 10 或 1000 时,LSB 会从结果中丢弃,因此您会得到 floatdouble.

的正确答案