Double à la fraction en Java
Donc ce que je suis en train de faire est de convertir le double de nombre rationnel. J'ai vérifier le nombre de chiffres il y a après le point décimal et je veux enregistrer le numéro 123.456 comme 123456 /1000, par exemple.
public Rational(double d){
String s = String.valueOf(d);
int digitsDec = s.length() - 1 - s.indexOf('.');
for(int i = 0; i < digitsDec; i++){
d *= 10;
}
System.out.println((int)d); //checking purposes
}
Cependant, pour le nombre 123.456-je obtenir un arrondi erreur et le résultat est 123455. Je suppose qu'il serait possible de corriger cela avec BigDecimal, mais je ne peux pas le faire fonctionner. Aussi, après avoir calculé ce nombre rationnel, il serait, je voudrais appeler un autre constructeur avec paramètres (int numérateur, int dénominateur) mais je ne peux bien évidemment faire appel au constructeur de la ligne où println est maintenant. Comment dois-je faire cela?
Tu ne peux pas mettre toutes les décimales derrière la dot en face d'elle tout en comptant le nombre de chiffres que vous avez pris? Supprimer la dot, d'analyser tout d'int et de créer un 2ème int à l'aide de 10 fois la quantité de nombres que vous avez pris?
Légèrement hors-sujet, mais vous savez que tout nombre rationnel est un nombre infini de fractions de représentations? Une option pourrait être à la recherche pour le canonique fraction, mais c'est un peu plus compliqué de ce que vous essayez de faire.
Aussi hors sujet, mais vous souhaitez peut-être envisager quelques erreurs d'algorithme. Par exemple, un double ne peut pas représenter 1/10 exactement, mais je ne suis pas sûr si vous voulez représenter le nombre rationnel 0.1000000000000000055511151231257827021181583404541015625. Sinon, comme vous le mentionnez, vous pouvez simplement utiliser BigDecimal.
OriginalL'auteur Neutrino | 2012-12-23
Vous devez vous connecter pour publier un commentaire.
Pour la première partie de la question, Java est de stocker des .6 comme .5999999 (répéter). Voir cette sortie:
Une des solutions est d'utiliser d = Math.round(d) immédiatement après votre boucle se termine.
Cela fonctionne - essayer.
Pour la deuxième partie de votre question...
Afin d'appeler le deuxième constructeur à partir de la première, vous pouvez utiliser le mot clé "this"
Mais elle doit être la première ligne dans le constructeur... qui n'a pas de sens ici (que nous avons à faire quelques calculs en premier). Je ne voudrais pas la peine d'essayer de le faire.
Quant à la deuxième partie: probablement, je n'ai pas l'état de mon problème avec suffisamment de précision. J'en ai deux constructeurs: d'abord avec le paramètre (double d), l'autre avec (int num, int denom). Dans la première, je veux convertir doubler le nombre de fraction et de l'appel de la deuxième constructeur.
Java est le stockage de votre double 123.456 comme 123455.999999 fois que vous avez fini de multiplier par 10. Une façon d'obtenir la bonne valeur est au tour ici.
Voir mon révisé après je l'ai testé et obtenu 123456/1000 que ma sortie standard.
Merci beaucoup, c'est bien maintenant.
OriginalL'auteur ktm5124
Ce code peut-être exagéré, mais elle vous traite de l'erreur d'arrondi que vous êtes en train de vivre, et elle prend également soin de répéter décimales (4.99999999999999 se transforme en 5, et 0.33333333333333333333 se transforme en 1/3).
Cela fournit les résultats suivants (les résultats de cas de test sont présentés comme des commentaires):
OriginalL'auteur Scott Canady
Ce n'est pas élégant, cependant, je crois que cela ne ce que vous demandez.
OriginalL'auteur Alex Musk
Ici, d=123.456 puis num=123456, j=1000
OriginalL'auteur OnePunchMan
Essayer
OriginalL'auteur Thato Molahlwe Shebe