C++ 双精度/浮点数到有理数(X/Y形式)

C++ 双精度/浮点数到有理数(X/Y形式),c++,C++,我应用以下方法将双精度/浮点形式转换为有理形式 例如 a=0.125 Find t=1000 Find k=GCD(t,a*t); Print (a*t/k) "/" t/k 它给出了0.125的正确o/p,但没有0.12。 问题在于找到t。请帮我解决这个问题。 这是密码 #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; int gcd(int a,in

我应用以下方法将双精度/浮点形式转换为有理形式

例如

a=0.125
Find t=1000 
Find k=GCD(t,a*t);
Print (a*t/k) "/" t/k
它给出了0.125的正确o/p,但没有0.12。 问题在于找到t。请帮我解决这个问题。 这是密码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int gcd(int a,int b)
{
  if(b==0)
  return a;
  else
  return gcd(b,a%b);
}
void DoubleToRational(float a)
{
  int t=1;
  while((float)t*a!=(int)(t*a))
  {
   //cout<<t*a<<" "<<(float)t*a<<" "<<(int)(t*a)<<endl; // For Checking
   t=t*10;
  }
  int k=gcd(t*a,t);
  cout<<(int)t*a/k<<" / "<<t/k;
}
int main()
{
  DoubleToRational(0.125); //0.021 seconds Works Perfectly
 // DoubleToRational(0.12); //Didnt Work ????
  return 0;
}
#包括
#包括
#包括
使用名称空间std;
内部gcd(内部a、内部b)
{
如果(b==0)
返回a;
其他的
返回gcd(b,a%b);
}
无效双托(浮动a)
{
int t=1;
而((浮点)t*a!=(int)(t*a))
{

//cout数字
0.125
可以用二进制浮点精确表示。但是数字
0.12
不能。因此,您正在寻找距离
0.12
最近的可表示数字的有理值。这绝对不是
3/25
。事实上,to
0.12
是:

0.11999 99999 99999 99555 91079 01499 37383 83054 73327 63671 875
为了在这项任务中取得合理的进展,您可能需要使用十进制数据类型而不是像
double
这样的二进制类型来表示您的值


如果上述内容对您来说没有任何实际意义,那么我建议您仔细阅读:。

使用十进制表示法表示0.12而不是二进制。停止使用
double
。但是假设输入是双精度的,如0.12、2.3456、1.76899922等,那么我应该应用什么方法将其转换为x/y形式……您不能表示
0.12
在一个
双精度
,就像我说的。你能得到的最接近的是
0.11999 99999999555 91079 01499 37383 83054 73327 63671 875
。所以如果你从
双精度
开始,那就太晚了。你丢失了重要信息。你需要使用十进制表示法。阅读我链接的论文。好的,谢谢你帮我清理了ubts…我还想知道另一种方法,当prcecision是高。。。。。