如何输出分数而不是十进制数?

Sea*_*ean 8 c++ fractions

在C++中,当我计算2/3时,它会输出十进制值,我怎样才能得到原始格式(ieg 2/3)而不是0.66666667

谢谢

Oli*_*rth 10

你不能.你需要写一个专门用于保持有理数(即分数)的类.或者只是使用Boost Rational Number库.


sle*_*ske 8

如果我理解正确,您有一个浮点数(a floatdouble类型变量),并且您希望将此值输出为分数.

如果是这种情况,您需要进一步指明您的问题:

  • 根据定义,FP编号一个分数:FP编号由两个整数组成,尾数为m,指数为e(和符号,但这与此无关).因此每个FP数实际上是一对(m,e),并且它表示的值ff = mb ^ e(其中b是固定的整数基数,通常是2).因此,作为分数的自然表示仅为m/b ^( - e),其中e <0(如果e> = 0,则f无论如何都是积分的).
  • 但是,您可能希望得到具有最小合理除数的分数.这是一个不同的问题.要获得,您可以使用Pari/GP库中的bestappr函数.在你的情况,你可能会使用bestappr(x, A)X你的输入,以及一个你想尝试的最大分母.bestappr会给你的分数最接近X分母仍然是小于.


小智 6

编写自己的Rational类来计算分歧

class Rational
{
public:
    int numerator, denominator;

    Rational(int num, int den=1){
        numerator = num;
        denominator=den;
    }
    Rational(Rational other){
        numerator = other.numerator;
        denominator = other.denominator;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return getrealformat();
    }
    Rational& operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return this;
    }
    Rational& operator / (Rational &divisor){
            numerator *= divisor.numerator;
            denominator *= divisor.denominator;
            simplificate();
            return this;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
        return getrealformat();
    }
    double getrealformat(){
        return numerator/denominator;
    }
    simplificate(){
        int commondivisor = 1;
        for(int i=2;i<=min(abs(numerator), abs(denominator));i++)
            if( numerator%i == 0 && denominator%i == 0 )
                commondivisor = i;
        numerator /= commondivisor;
        denominator /= commondivisor;
    }
};
Run Code Online (Sandbox Code Playgroud)

使用

Rational r1(45), r2(90), r3=r1/r2;
cout<<r3.numerator<<'/'<<r3.denominator;
cout<<r3.getrealformat();
Run Code Online (Sandbox Code Playgroud)