Convertir un nombre Décimal en Fraction
Je suis en train de convertir un nombre décimal en sa fraction. Les nombres décimaux sera d'avoir un maximum de 4 chiffres après la virgule.
exemple:- 12.34 = 1234/100
12.3456 = 123456/10000
mon code :-
#include <stdio.h>
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 de résultat correct, les nombres Décimaux sera de double précision seulement.Merci de me guider ce que je dois faire.
- Ne pas utiliser de virgule flottante à tous, et utiliser à la place de la virgule fixe entiers, c'est à dire faire de votre unité de 1/10000.
int d = (int)round(a * c);
serait un bon point de départ. Si vous utilisez uniquementfloor
et de troncature, des choses comme12.34 = 12.339999999999999857891452847979962825775146484375
peut vous passionner dur. Mais je suis d'accord avec Kerrek, vous devez utiliser des entiers depuis le début, pour que.- l'Une de mes questions a été marqué comme un doublon de celui-ci, même si c'est à propos de JavaScript, et pas C. :/
Vous devez vous connecter pour publier un commentaire.
Si votre nombre à virgule flottante est
x
, puis le numérateur de la fraction à plus de 10000 sera partie intégrante de(x + 0.00005) * 10000
. C'est à vous de décider si vous souhaitez réduire la fraction de la plus simple des termes (c'est à dire diviser par le pgcd du numérateur et du dénominateur).Le problème est que
b
a été prise en 3400.00 mais quand vous ne(int) b
vous obtenez 3399, vous devez ajouter des0.5
de sorte que le nombre peut tronquer à 3400.Arriver 3400.00 est différent que d'avoir 3400, 3400.00 signifie que le nombre a été tour à 3400, c'est pourquoi, lorsque vous n' (int) 3400.00 il suppose que l'entier le plus proche (à moins de le nombre de la conversion) est 3399, cependant, lorsque vous ajoutez 0,5 à ce numéro de la dernière l'entier le plus proche est maintenant 3400.
Si vous souhaitez acquérir une compréhension plus profonde de l'arithmétique à virgule flottante lire Ce Que Tout Informaticien Devez Savoir À Propos De L'Arithmétique À Virgule Flottante
c'est une question intéressante.
Je pense que vous pourriez être mieux de commencer par la lecture sur les multiples façons de calculer le "plus grand commun diviseur" ( http://en.wikipedia.org/wiki/Greatest_common_divisor est une bonne source ).
Mettre en œuvre un rapide&sale algorithme qui fait que ces calculs comme vous le feriez avec un stylo et du papier, puis d'étudier la manière dont les doubles sont représentés (signe, exposant mantisse) et d'améliorer votre algorithme pour prendre avantage de cette représentation.
malheureusement, il n'y a pas beaucoup plus que je peux le faire sans la rédaction de votre morceau de code.
Un algorithme créé avec c++ qui n'nombre décimal en fraction.