Convertir le nombre décimal en fraction

J’essaye de convertir le nombre décimal en sa fraction. Les nombres décimaux auront un maximum de 4 chiffres après la décimale. exemple: – 12.34 = 1234/100 12.3456 = 123456/10000

mon code: –

#include  int main(void) { double a=12.34; int c=10000; double b=(a-floor(a))*c; int d=(int)floor(a)*c+(int)b; while(1) { if(d%10==0) { d=d/10; c=c/10; } else break; } printf("%d/%d",d,c); return 0; } 

mais je n’obtiens pas une sortie correcte, les nombres décimaux ne seront que de la double précision. Merci de me guider.

Si votre nombre en virgule flottante est x , le numérateur de la fraction supérieure à 10 000 fera partie intégrante de (x + 0.00005) * 10000 . C’est à vous de décider si vous voulez réduire la fraction à des termes plus simples (c’est-à-dire diviser par le gcd du numérateur et du dénominateur).

 #include  int main(void) { double a = 12.34; int c = 10000; double b = (a - floor(a)) * c; int d = (int)floor(a) * c + (int)(b + .5f); printf("%f %d\n", b, d); while(1) { if(d % 10 == 0) { d = d / 10; c = c / 10; } else break; } printf("%d/%d\n", d, c); return 0; } 

Le problème est que b obtenait 3400,00 mais que lorsque vous faites (int) b vous obtenez 3399, vous devez donc append 0.5 pour que le nombre puisse être tronqué à 3400.

Obtenir 3400.00 est différent d’avoir 3400, 3400,00 signifie que le nombre était arrondi à 3400; c’est pourquoi, lorsque vous effectuez (int) 3400,00, on suppose que l’entier le plus proche (inférieur au nombre que vous convertissez) est 3399; toutefois, lorsque vous ajoutez 0.5 à ce nombre, le dernier entier le plus proche est maintenant 3400.

Si vous souhaitez acquérir une compréhension plus approfondie de l’arithmétique en virgule flottante, lisez Tout ce que l’informaticien devrait savoir sur l’ arithmétique en virgule flottante.

C’est une question intéressante. Je pense que vous feriez mieux de commencer par lire sur les multiples façons de calculer le “plus grand commun diviseur” ( http://en.wikipedia.org/wiki/Greatest_common_divisor est une bonne source).

Implémentez un algorithme quick & dirty qui effectue ces calculs comme vous le feriez avec un stylo et du papier, puis examinez la façon dont les doublons sont représentés (signe, exposant, mantisse) et améliorez votre algorithme pour tirer parti de cette représentation.

Malheureusement, je ne peux rien faire de plus sans écrire votre code.

Un algorithme créé avec c ++ qui décimal en fraction.

 #include  using namespace std; // converts the ssortingng half of the inputed decimal number into numerical values void converting (ssortingng decimalNumber, float& numerator, float& denominator ) { float number; ssortingng valueAfterPoint = decimalNumber.substr(decimalNumber.find(".") + 1,((decimalNumber.length() -1) )); // store the value after the decimal into a valueAfterPoint cout << valueAfterPoint<< " "<< endl; int length = valueAfterPoint.length(); //stores the length of the value after the decimal point into length numerator = atof(valueAfterPoint.c_str()); // converts the string type decimal number into a float value and stores it into the numerator // loop increases the decimal value of the numerator and the value of denominator by multiples of ten as long as the length is above zero of the decimal cout << length<< endl; for (; length > 0; length--) { numerator *= 10; } do denominator *=10; while (denominator < numerator); } // simplifies the the converted values of the numerator and denominator into simpler values for an easier to read output void simplifying (float& numerator, float& denominator) { int maximumNumber = 9; //Numbers in the tenths place can only range from zero to nine so the maximum number for a position in a poisitino for the decimal number will be nine bool isDivisble; // is used as a checker to verify whether the value of the numerator has the found the dividing number that will a value of zero // Will check to see if the numerator divided denominator is will equal to zero if(int(numerator) % int(denominator) == 0) { numerator /= denominator; denominator = 1; return; } //check to see if the maximum number is greater than the denominator to simplify to lowest form while (maximumNumber < denominator) { maximumNumber *=10; } // the maximum number loops from nine to zero. This conditions stops if the function isDivisible is true for(; maximumNumber > 0; maximumNumber --) { isDivisble = ((int(numerator) % maximumNumber == 0) && int(denominator)% maximumNumber == 0); cout << numerator << denominator <<" " <> decimalNumber; //convert function converting(decimalNumber, numerator, denominator); //call simplyfication funcition simplifying(numerator, denominator); cout<< "Fraction: "<< numerator << "/" << denominator<< endl; return 0; }