字符串转换为浮点数/双精度浮点数解析

3
当我尝试将以下字符串解析为浮点数和双精度浮点数时:
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

但是当我用浮点数和双精度数乘以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

4
好的,你有什么问题?FloatDouble精度更低。 - Vyacheslav
当您使用System.out.println("Float Value: "+Float.parseFloat("8.40f")*100);时,是否会发生相同的情况? - mambax
2个回答

4

这将很好地工作:

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

因为doublefloat的不同表示,或更精确地说,是关于float的IEEE-754舍入。在这里了解更多信息。 float具有较小的范围和精度,因此当您有内存时(今天您有),使用double会更好。但是,它们都有问题!在Java中有一种更好的选项叫做BigDecimal,建议您使用它,因为它不会出现尺寸问题,而且今天我们拥有强大的计算机,所以处理需要最大精度的大量小数时,不会遇到内存和速度方面的问题。例如,如果您开发的软件涉及大量货币交易,则必须使用BigDecimal

BigDecimal、float 和 double 都有很好的用途。我见过许多情况,其中每个选项都比其他两个更好。总是使用 BigDecimal 和总是使用其他两个之一一样严重的错误。 - Patricia Shanahan
你知道一个好的 BigDecimal 等三角函数库吗?这将极大地扩展它的实用性。 - Patricia Shanahan
Apache Common-Langs 应该有一些相关的东西... Google Guava 有 MathUtils,所以它也应该能够处理这个问题... 但是,最好还是自己创建相关的工具 - 这样可以更好地控制,并且可以避免过多的检查和抽象化... - Adnan Isajbegovic
我尝试查找guava mathutils,但无法找到如何使用它来计算BigDecimal的正弦或反正切等内容。您能给出更具体的指针吗?我一直在编写矢量处理器的三角库代码。我很惊讶您会建议像那样自己编写。我碰巧具备所需的数学背景,但我认为大多数读者并非如此。 - Patricia Shanahan
这些是我知道的一些具有数学函数的库,但我从未像这样使用过它们,只是从中提取了一些结构。如果你不需要太高的精度,Java Math类就可以了。但是对于超高精度,我找不到任何库(至少不在谷歌的前几个建议中),但作为数学家和Java后端企业开发人员,我建议使用Wolfram Alpha Java绑定库,这样您就可以充分利用Wolfram软件的全部潜力,这是目前最好的选择。 - Adnan Isajbegovic
显示剩余2条评论

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

一个很好的显示问题的工具是这个:http://www.h-schmidt.net/FloatConverter/IEEE754.html - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接