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

Bal*_*gyi 9 java floating-point

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

System.out.println(2.0f - 1.9f);
Run Code Online (Sandbox Code Playgroud)

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

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

System.out.println(0.1f);
Run Code Online (Sandbox Code Playgroud)

Java如何处理这个问题?

ass*_*ias 14

System.out.println为浮动和双打执行一些舍入.它使用Float.toString(),它本身(在oraclew JDK中)委托给FloatingDecimal类 - 你可以查看血腥细节的来源FloatingDecimal#toJavaFormatString().

如果你试试:

BigDecimal bd = new BigDecimal(0.1f);
System.out.println(bd);
Run Code Online (Sandbox Code Playgroud)

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

  • 您根本不需要查看源代码 - 您可以查看`Float.toString(float)`的文档,它给出了一个非常明确的原因:`Float.toString(0.1f)`将返回"0.1" . (3认同)

Jon*_*eet 6

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

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

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