c++;fmod为fmod返回0.2(0.6,0.2) 当我在C++中使用fMOD(0.60.2)时,它返回0.2

c++;fmod为fmod返回0.2(0.6,0.2) 当我在C++中使用fMOD(0.60.2)时,它返回0.2 ,c++,floating-accuracy,fmod,C++,Floating Accuracy,Fmod,我知道这是由浮点精度引起的,但现在看来我必须得到两倍的余数 非常感谢您为这类问题提供的任何解决方案我认为您在这里的最佳选择是使用余数函数而不是fmod。对于给定的示例,它将返回一个非常小的数字,而不是0.2。通过四舍五入到一定的精度级别,您可以利用这一事实假定余数为0。数学值0.6和0.2不能用二进制浮点精确表示 此演示程序将向您展示正在进行的操作: #include <iostream> #include <iomanip> #include <cmath>

我知道这是由浮点精度引起的,但现在看来我必须得到两倍的余数


非常感谢您为这类问题提供的任何解决方案

我认为您在这里的最佳选择是使用余数函数而不是fmod。对于给定的示例,它将返回一个非常小的数字,而不是0.2。通过四舍五入到一定的精度级别,您可以利用这一事实假定余数为0。

数学值
0.6
0.2
不能用二进制浮点精确表示

此演示程序将向您展示正在进行的操作:

#include <iostream>
#include <iomanip>
#include <cmath>
int main() {
    const double x = 0.6;
    const double y = 0.2;
    std::cout << std::setprecision(60)
              << "x          = " << x << "\n"
              << "y          = " << y << "\n"
              << "fmod(x, y) = " << fmod(x, y) << "\n";
}
根据您传递的参数,
fmod()
返回的结果是正确的


如果您需要一些其他结果(我假定您期望的是
0.0
),那么您必须做一些不同的事情。有许多可能性。您可以检查结果是否与
0.2
相差很小,或者您可以使用整数算法进行计算(例如,如果您处理的所有数字都是
0.1
0.01
的倍数)。

您是对的,问题是舍入错误。请尝试以下代码:

#include <stdio.h>
#include <math.h>
int main()
{
    double d6 = 0.6;
    double d2 = 0.2;
    double d = fmod (d6, d2);
    printf ("%30.20e %30.20e %30.20e\n", d6, d2, d);

}
至于如何“修复”它,我不知道你到底想做什么,不知道该建议什么。总会有一些数字不能用浮点表示,所以这种行为是不可避免的


关于问题域的更多信息将有助于获得更好的建议。例如,如果正在处理的数字始终只有小数点后一位,并且足够小,只需乘以10,四舍五入到最接近的整数(或长或长),并使用%运算符而不是fmod函数。如果您试图查看fmod的结果是否为0.0,只需接受一个接近0.2(在本例中)的结果,就好像它接近0一样。

它可能不是0.2。如果(fmod(0.6,0.2)=0.2)尝试这个
看看会发生什么。你期望的值是多少?@EJP谢谢你的关注,我期望的是0作为fmod(0.4,0.2)和fmod(0.6,0.3)它们都返回0余数函数在某些情况下返回负值这不是我需要的,但你的答案确实有帮助。现在我在fmod之后添加了一个判断,如果它返回的值非常接近0.2(特定级别的精度)它将返回0是的,我最后在fmod之后添加了一个判断语句,以检查返回值是否与0.2的值相差非常小,并且从那时起它工作得很好。我不确定函数调用前的小数位数,所以现在我找不到采用第二种解决方案的好方法,但这很有帮助,也许我以后会试试
5.99999999999999977796e-01     2.00000000000000011102e-01     1.99999999999999955591e-01