为什么Java处理浮点的不精确性如此奇怪?

为什么Java处理浮点的不精确性如此奇怪?,java,floating-point,precision,Java,Floating Point,Precision,在与一些程序员同事就浮点不精确性进行了一次小讨论之后,我们发现Java的某些行为对我们来说非常奇怪 System.out.println(0.1 + 0.2); // 0.30000000000000004 System.out.println((float) 0.1 + (float) 0.2); // 0.3 出于某种原因,当您将变量强制转换为浮点时,不精确性会消失吗?我们试图寻找一些解释,但找不到任何解释 有人知道Java为什么会这样做吗 注意:我知道什么是浮点不精确,只是不知道为什么当

在与一些程序员同事就浮点不精确性进行了一次小讨论之后,我们发现Java的某些行为对我们来说非常奇怪

System.out.println(0.1 + 0.2); // 0.30000000000000004
System.out.println((float) 0.1 + (float) 0.2); // 0.3
出于某种原因,当您将变量强制转换为浮点时,不精确性会消失吗?我们试图寻找一些解释,但找不到任何解释

有人知道Java为什么会这样做吗

注意:我知道什么是浮点不精确,只是不知道为什么当我转换为浮点时它会消失。我知道这里的精度问题有所不同。

产生的十进制数字刚好足以唯一区分浮点数和相邻浮点数

当源文本
0.3
转换为
double
时,结果是最接近的
double
值,即0.299999999999988897769797537484345957683319091796875。打印时,“0.3”足以唯一标识它,因为0.29999999999988897769753748434595763683319091796875当然是最接近的值,因为这是我们从
0.3
首先获得它的方式

源文本
0.1
0.2
产生0.10000000000000055115123125782702118158340451015625和 0.200000000000000011102230246251565404236316680908203125. 以
double
格式添加时,结果为0.30000000000444089209898500626169452667236328125。注意这与上面的数字不同。因此,打印时,“0.3”不足以将其与相邻值0.29999999999888977697537484345957683319091796875区分开来。必须生成“0.300000000000000004”以表明其不同

将值转换为
浮点
时,将使用
浮点
格式,而不是
双精度
格式。当格式化
float
时,只有
float
中可表示的值才是相邻值的候选值。
float
中可表示的最接近0.3的值为0.3000001192092895078125。这也是
(float)0.1+(float)0.2
的结果,仅通过打印“0.3”即可将其与相邻的
float
值(0.299999821186065673828125和0.30000041732513427734375)充分区分开来.

生成刚好足够的十进制数字,以唯一区分浮点数与相邻浮点数

当源文本
0.3
转换为
double
时,结果是最接近的
double
值,即0.299999999999988897769797537484345957683319091796875。打印时,“0.3”足以唯一标识它,因为0.29999999999988897769753748434595763683319091796875当然是最接近的值,因为这是我们从
0.3
首先获得它的方式

源文本
0.1
0.2
产生0.10000000000000055115123125782702118158340451015625和 0.200000000000000011102230246251565404236316680908203125. 以
double
格式添加时,结果为0.30000000000444089209898500626169452667236328125。注意这与上面的数字不同。因此,打印时,“0.3”不足以将其与相邻值0.29999999999888977697537484345957683319091796875区分开来。必须生成“0.300000000000000004”以表明其不同


将值转换为
浮点
时,将使用
浮点
格式,而不是
双精度
格式。当格式化
float
时,只有
float
中可表示的值才是相邻值的候选值。
float
中可表示的最接近0.3的值为0.3000001192092895078125。这也是
(float)0.1+(float)0.2
的结果,它与相邻的
float
值(0.299999821186065673828125和0.300000417232513427734375)仅打印“0.3”即可充分区分。这是一个不同的问题,与此行为无关。我知道为什么它们是不准确的,只是不知道为什么如果你投下它们,它们会消失@陛下,这是一个不同的问题,与这种行为无关。我知道为什么它们是不准确的,只是不知道为什么如果你投下它们,它们会消失@父系网络4下位投票者