如何将小数格式化为具有分母限制的分数

时间:2010-08-24 06:01:09

标签: c++ objective-c decimal

大家好我试图将小数A格式化为分数B + C / D,其中对D施加一定的限制,假设D可以是[2 ... 9]或[2 ... 19]中的一个BCD是整数 目标是使格式化的分数尽可能接近小数。 这是否有现有的算法/理论? 或者我可以在Mac SDK上调用任何API吗?

2 个答案:

答案 0 :(得分:1)

// Not tested or even compiled :-). Assumes you are handling sign
// in:  a - the decimal to convert
//      limit - the largest denominator you will allow
// out: outN - Numerator
//      outD   Denominator

#include <math.h>

void d2f(double a, int limit, int& outN, int& outD) {
    double z;
    int dPrev, d, n;
    a = fabs(a);
    z = a;
    d = 1;
    n = a;
    dPrev = 0;
    while (a - (double)(n/d) != 0 && z != floor(z)) {
        z = 1 / (z - floor(z));
        int tmp = d;
        d = d * (int)floor(z) + dPrev;
        if (d > limit) {
            d = tmp;
            break;
        }
        dPrev = tmp;
        n = floor(a * d + 0.5);
    }
    outN = n;
    outD = d;
}

希望有帮助/有效: - )

答案 1 :(得分:0)

查看连续分数。