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)(它将始终提供与您要打印的字符串相同的结果):
m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,并且除此之外必须有多个,但只有多少个,更多的数字才能唯一地将参数值与float类型的相邻值区分开来.
由于0.1f是与精确值最接近的可表示浮点数0.1,因此不需要更多数字来唯一地区分该float类型的任何其他值.