循環小数を分数に変換するよ!
#define round(x) ((x >= 0) ? (int)(x + 0.5) : (int)(x - 0.5)) #define absolute(x) ((x >= 0) ? x : -x) #define LIMIT 1.0E-6 // 循環小数を分数に変換 void double_to_frac(double n, int m) { int a, b, xa = 1, xb = 1, p = 1; // p = 10^m while (m--) p *= 10; // nを分数に変換 while (absolute(n - round(n)) > LIMIT) { n *= 10; xa *= 10; } // 非循環部と循環部に切り分けて処理 a = round(n) / p; xa /= p; b = round(n) - a * p; if (p != 1) xb = (p-1) * xa; // とりあえず画面表示だけ printf("%d/%d\n", a*xb + b*xa, xa*xb); }
引数の double n
は変換する浮動小数点数で、int m
は循環する桁数。