将浮点十进制值转换为分数

新手上路,请多包涵

给定一个十进制浮点值,你怎么能找到它的小数等价/近似值?例如:

 as_fraction(0.1) -> 1/10
as_fraction(0.333333) -> 1/3
as_fraction(514.0/37.0) -> 514/37

是否有可以将十进制数转换为小数形式的通用算法?如何在 C++ 中简单有效地实现这一点?

原文由 Kehlin Swain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
1 个回答

首先获取小数部分,然后获取 gcd。使用欧几里得算法 http://en.wikipedia.org/wiki/Euclidean_algorithm

 void foo(double input)
{
    double integral = std::floor(input);
    double frac = input - integral;

    const long precision = 1000000000; // This is the accuracy.

    long gcd_ = gcd(round(frac * precision), precision);

    long denominator = precision / gcd_;
    long numerator = round(frac * precision) / gcd_;

    std::cout << integral << " + ";
    std::cout << numerator << " / " << denominator << std::endl;
}

long gcd(long a, long b)
{
    if (a == 0)
        return b;
    else if (b == 0)
        return a;

    if (a < b)
        return gcd(a, b % a);
    else
        return gcd(b, a % b);
}

原文由 qbt937 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题