C++ 分数加法重载 浮点错误

img


代码如下:


#include<iostream>
#include<cmath>
using namespace std;
class FS {
private:
    int fz;
    int fm;
public:
    FS() {};
    FS(int fz, int fm) :fz(fz), fm(fm) {};
    int getFz() {
        return this->fz;
    }
    int getFm() {
        return this->fm;
    }
    FS operator+(const FS& x) {
        FS temp;
        temp.fz = this->fz * x.fm + this->fm * x.fz;
        temp.fm = this->fm * x.fm;
        int a = abs(temp.fz); int b = abs(temp.fm);
        //先保证b是较大的
        if(a>b){
            int temp = b;
            b = a;
            a = temp;
        }
        //辗转相除求最大公约数
        while(b%a!=0){
            int temp = b % a;
            b = a;
            a = temp;
        }
        //约分
        temp.fz/=a;
        temp.fm/=a;
        
        return temp;
    }
};

int main() {
    int n, fz1, fm1, fz2, fm2;
    char a, b;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> fz1 >> a >> fm1 >> b;
        cin >> fz2 >> a >> fm2 >> b;
        FS fs1(fz1, fm1);
        FS fs2(fz2, fm2);
        FS fs3; fs3 = fs1 + fs2;
        if (fs3.getFz() == 0) {
            cout << "0z1m" << endl;
        }
        //把分母的负号给分子
        else if (fs3.getFm() < 0) {
            cout << -fs3.getFz() << "z" << -fs3.getFm() << "m" << endl;
        }
        else if(fs3.getFm()!=0){
            cout << fs3.getFz() << "z" << fs3.getFm() << "m" << endl;
        }
    }
}

这里我保证了b%a!=0,也即a不会为0,为什么会出现浮点错误?

img


注:请不要给我一份AC代码的链接,否则不予采纳

问题就是a等于0了,你可以测试一下0z1m+0z1m,还有1z5m+1z-5m。这两种情况都是分子a等于0,分母b大于0。