为什么0.1表示正确浮点数? (我知道为什么不在2.0-1.9的结果)

我最近读了很多关于浮点表示的内容(包括: 如何在浮点运算和十进制中表示0.1 )。 现在我明白0.1无法正确表示,当我这样做时:

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

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

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

 System.out.println(0.1f); 

Java如何处理这个问题?

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

如果你试试:

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

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

Float.toString(float)的文档(它将始终提供与您正在打印的字符串相同的结果):

m或a的小数部分必须打印多少位? 必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来。

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