Java Math.IEEERemainder令人困惑的结果

时间:2018-06-19 01:51:36

标签: java math standards ieee-754

Java的Math.IEEERemainder函数声明:

  

余数值在数学上等于f1-f2×n,其中n为   最接近精确数学值的数学整数   商f1 / f2,如果两个数学整数同样接近   到f1 / f2,那么n是偶数

的整数


对于以下内容:

double f1 = 0.1;
double f2 = 0.04;
System.out.println(Math.IEEEremainder(f1, f2));

输出为-0.019999999999999997
但是,0.1/0.04 = 2.5与整数23等距。我们不应该在此处选择n = 2,而不是0.1 - 0.04*2 = 0.02,而不是-0.02

1 个答案:

答案 0 :(得分:2)

请参阅:Is floating point math broken?

您会认为0.1 / 0.04会准确地返回2.5,但事实并非如此。根据{{​​3}},0.1无法使用IEEE 754准确表示,实际上表示为0.100000000000000005551...

在这种情况下,由于这个微小的偏移,商略高,这导致3的值n,因为它在2之间不再等距{1}}和3

计算它会产生以下结果:

0.1 - 0.04 * 3 = 0.1 - 0.12 = -0.02 ~= -0.019999999999999997