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

标签 c++ algorithm fractions

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

as_fraction(0.1) -> 1/10
as_fraction(0.333333) -> 1/3
as_fraction(514.0/37.0) -> 514/37
是否有可以将十进制数转换为小数形式的通用算法?如何在 C++ 中简单有效地实现这一点?

最佳答案

先取小数部分,再取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);
}

关于c++ - 将浮点十进制值转换为分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64828740/

相关文章:

c++ - 在链接静态库之前让cmake修改目标文件

c++ - 使用 TBB 的非常基本的 for 循环

c++ - 对 std::unique 实现感到困惑?

c++ - C++03中的完美转发

algorithm - 如何归一化椭圆傅里叶系数?

java - 用线检测拦截

algorithm - 查找 (x,y) 对的数量,其中 x^k + y^k = n

ios - setMaximumFractionDigits 的问题

c# - 如何简化 C# 中的分数?

python - 将分数存储为 Rational Python