How to calculate the fraction representation of a float number in C++

1 Answer

0 votes
#include <iostream>
#include <cmath> // round
#include <vector>
#include <numeric> // For std::gcd
  
// Function to convert a decimal to a fraction
std::pair<int, int> decimalToFraction(double decimal, double tolerance = 1e-6) {
    int numerator = 1, denominator = 1;
    double error = std::abs(decimal - static_cast<double>(numerator) / denominator);
  
    // Iteratively find the best numerator and denominator
    for (int d = 1; d <= 100000; d++) { // Limit denominator to avoid infinite loops
        int n = static_cast<int>(std::round(decimal * d));
        double currentError = std::abs(decimal - static_cast<double>(n) / d);
  
        if (currentError < error) {
            numerator = n;
            denominator = d;
            error = currentError;
  
            // Stop if the error is within the acceptable tolerance
            if (error < tolerance) {
                break;
            }
        }
    }
  
    // Simplify the fraction using GCD
    int divisor = std::gcd(numerator, denominator);
    numerator /= divisor;
    denominator /= divisor;
  
    return {numerator, denominator};
}
  
int main() {
    std::vector<double> testDecimals = {0.5, 0.3333, 0.25, 0.75, 1.2, -0.4, 3.125, 2.71828};
    std::cout << "Test Data (Decimal to Fraction):\n";
      
    for (double decimal : testDecimals) {
        auto fraction = decimalToFraction(decimal);
        std::cout << "Decimal: " << decimal << " -> Fraction: " << fraction.first << "/" << fraction.second << "\n";
    }
}
  
  
  
/*
run:
  
Test Data (Decimal to Fraction):
Decimal: 0.5 -> Fraction: 1/2
Decimal: 0.3333 -> Fraction: 3236/9709
Decimal: 0.25 -> Fraction: 1/4
Decimal: 0.75 -> Fraction: 3/4
Decimal: 1.2 -> Fraction: 6/5
Decimal: -0.4 -> Fraction: -2/5
Decimal: 3.125 -> Fraction: 25/8
Decimal: 2.71828 -> Fraction: 1264/465
  
*/

 



answered Jun 30, 2025 by avibootz
edited Aug 28, 2025 by avibootz
...