C++ 如何使用fmod(浮动)检查并获取余数?

C++ 如何使用fmod(浮动)检查并获取余数?,c++,floating-point,fmod,C++,Floating Point,Fmod,我的目标是检查在除以2个浮点数时是否还有余数,如果有,将余数返回给用户 给出下面的代码,我原以为fmod(2,0.2)会是0,但是,我得到了0.2。我读到这与浮点问题有关。但是有什么方法可以正确地做到这一点吗 int main() { float a = 2.0; float b = 0.2; float rem = fmod(a, b); if (rem > 0) { std::cout << "There is a rem

我的目标是检查在除以2个浮点数时是否还有余数,如果有,将余数返回给用户

给出下面的代码,我原以为
fmod(2,0.2)
会是0,但是,我得到了
0.2
。我读到这与浮点问题有关。但是有什么方法可以正确地做到这一点吗

int main() {
    float a = 2.0;
    float b = 0.2;

    float rem = fmod(a, b);

    if (rem > 0) {
        std::cout << "There is a remainder: " << rem << std::endl;
    } else {
        std::cout << "No remainder: " << rem << std::endl;
    }
}
intmain(){
浮点数a=2.0;
浮动b=0.2;
浮动rem=fmod(a,b);
如果(rem>0){

std::cout是的,你的直觉是正确的。
std::fmod
正在计算

std::fmod(2.0f, 0.20000000298023223876953125f)
其中第二个参数是最接近IEEE754(假设您的平台使用该参数)
float
0.2

幸运的是,尽管数学模在乘法中是分布的,所以你们可以休息一下

double rem = (long long)std::round(a * 10) % (long long)std::round(b * 10) / 10.0;

根据原始问题所需的小数位数,使用10的更大幂。

谢谢,伙计,只是为了确定:不应该是这样:
rem=std::min(a,std::abs(rem-0.2));
(注意
a
而不是
rem
)不,我的意图是更正另一个语句中的浮点。我真的很感谢你的帮助。在这种情况下,在我将结果
rem
转换为float之后,我如何检查是否有余数?因为测试
rem>0
当前通过。我应该将其设置为
rem>0.001
?哈哈,不你不-谢谢-它现在看起来工作!我欣赏它,实际上采取双不浮点参数-<代码> fMODER()/>代码有浮点和长双重载,BTW.C++不象C,在使用浮点时(或<代码> <代码>版本),你应该使用<代码> fMODFF()/<代码>。对于那些不恰当地投票将其视为重复的人:浮点算术使用舍入的事实并不意味着你只是放弃并接受它。这个问题要求解决一个特定问题,而解决方案是存在的,在另一个问题中没有讨论。我们需要澄清这个问题。你可能知道,.2
转换为通常不精确的
双精度
值。2(而
.2f
转换为不精确的
浮点值。2)那么,首先要解决的问题是你想知道a
float
a
是否正是a
float
b
的倍数,还是你想知道a
float
a
是否正是某个数学数b的倍数?如果是后者,那么b的形式是什么是十进制数字吗?请告诉我们发生这种情况的上下文。