谢谢
你不能这样做。你需要编写一个专门用于保存有理数(即分数)的类。或者只需使用Boost Rational Number library。
如果我理解正确,您有一个浮点数 (一个 float
或 double
类型的变量),并且您想将此值输出为分数。
如果是这种情况,您需要进一步说明您的问题:
bestappr(x, A)
,其中 x 是您的输入,A 是您想尝试的最大分母。bestappr 将为您提供最接近 x 且分母仍小于 A 的分数。编写自己的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;
}
};
使用
Rational r1(45), r2(90), r3=r1/r2;
cout<<r3.numerator<<'/'<<r3.denominator;
cout<<r3.getrealformat();
float
或 double
转换为 Rational
的过程? - Thomas Matthews如何仅获取原始格式(即2/3),而不是0.66666667
只有通过使用类似GMP库的自定义输出运算符来包装才能实现。以下是有关GMP的更多信息:
GMP是一个自由的库,用于任意精度算术,可操作有符号整数、有理数和浮点数。除了机器上可用内存所暗示的限制外,精度没有实际限制。GMP具有丰富的功能,并且这些功能都具有规则的接口。
GMP的主要目标应用程序是密码学应用程序和研究、Internet安全应用程序、代数系统、计算代数研究等。
GMP被精心设计成尽可能快,对于小操作数和大操作数都是如此。通过使用fullwords作为基本算术类型,使用快速算法,对于许多CPU的最常见内部循环使用高度优化的汇编代码以及一般强调速度来实现速度。
GMP比任何其他bignum库都要快。对于许多操作,GMP的优势随着操作数大小的增加而增加,因为GMP使用渐近更快的算法。
第一个GMP版本发布于1991年。它正在持续开发和维护,每年发布一个新版本。
float
或double
转换为分数。使用Fraction类可以进行分数转换。 - Thomas Matthewsfloat
和double
在某种程度上也是分数。据我所理解,问题是如何从一开始就处理这个问题,解决方案是避免首先创建float
或double
变量。 - Mauro Vanetti通常情况下这是不可能的:浮点数不精确并且无法保存足够的信息以完全重构分数。
然而,您可以编写一个函数,启发式地找到“最佳”逼近值,其中优先选择具有小分子和分母的分数,以及与浮点数几乎相同的值的分数。
如果您完全控制代码,则 Oli 的想法更好:首先不要丢弃信息。
您可以将所有分数的分子和分母存储为整数。整数在二进制中具有精确表示。
#include <iostream>
using namespace std;
int main() {
int a,b,q,r;
cin>>a>>b;//first number and second number
q = a/b;
r = a-q*b;
cout<<q<<" "<<r<<" "<<"/"<<" "<<b<<"\n";
return 0;
}
我刚刚通过 a/b 得到商,然后通过 a-q*b 得到余数。如果有任何建议,请提出。
我是初学者,我使用的方法可能不是正确的方式
#include <iostream>
using namespace std;
int main ()
{
double a;
double b;
double c;
cout << "first number: ";
cin >> a;
cout << "second number: ";
cin >> b;
c = a/b;
cout << "result is: " << c << endl;
if (b != 0) {
if (a > 0) {
if (c - (int)c > 0 && c - (int)c < 1)
cout << "fraction: " << a << "/" << b;
} else {
if (c - (int)c < 0 && c - (int)c < 1)
cout << "fraction: " << a << "/" << b;
}
}
return 0;
}
1.25
分离成1
和.25
)。但是这个问题是关于将浮点数转换为有理数的分数表示,即1 1/4
或5/4
。 - jogojapan1.25
的输出是 1
和 .25
,对吗?它是如何将 .25
转换为 1/4
的呢? - jogojapana
和 b
。其他一些答案也提到了这一点;如果输入一个有理数,你可以简单地将其存储起来,以便在需要时使用。但真正的困难在于从浮点数计算 a
和 b
。 - jogojapanc
,程序就会计算出 a
和 b
。但无论如何...这并不是很重要。 - jogojapan