11

我最近读了很多关于浮点表示的内容(包括:How To Represent 0.1 In Floating Point Arithmetic And Decimal)。现在我明白 0.1 无法正确表示,当我这样做时:

System.out.println(2.0f - 1.9f);

我永远不会得到精确的结果。

所以问题是:如何在以下代码中表示 0.1f 才能正确打印 0.1?那是某种合成糖吗?在我上面提到的文章中说:0.1 在内存中表示为 0.100000001490116119384765625。那么为什么我没有得到这段代码的输出:

System.out.println(0.1f);

Java 是如何处理这个问题的?

4

2 回答 2

18

System.out.println对浮点数和双精度数执行一些舍入。它使用Float.toString(), 它本身(在 oraclew JDK 中)委托给FloatingDecimal该类 - 您可以查看源代码以FloatingDecimal#toJavaFormatString()获取血腥细节。

如果你试试:

BigDecimal bd = new BigDecimal(0.1f);
System.out.println(bd);

您将看到 0.1f 的实际值:0.100000001490116119384765625。

于 2012-08-26T09:01:45.700 回答
6

从文档中Float.toString(float)(它总是会给出与您正在打印的字符串相同的结果):

m 或 a 的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,必须有尽可能多的数字,但仅能将参数值与浮点类型的相邻值区分开来。

由于 0.1f 是最接近精确值的可表示浮点数0.1,因此不需要更多数字来唯一地将其与该类型的任何其他值区分开来是有道理的float

于 2012-08-26T09:03:05.240 回答