2012-01-11 3 views
5

Possible en double:
Round a double to 2 significant figures after decimal pointpoints décimaux arrondis

Je suis en train de travailler avec la conversion d'un degré décimal (23,1248) dans un degré de style minutes (23 7'29.3"). c'est ce que j'ai jusqu'à présent:

double a=23.1248; 
    int deg=(int)a;//gives me the degree 
    float b=(float) (a-deg); 
    int min=(int) (b*60);//gives me the minutes 
    double sec= (double) ((c*60)-min);//gives me my seconds 

tout fonctionne bien, mais je voudrais arrondir les secondes au dixième ou au plus proche. J'ai regardé le formatage décimal, mais je préférerais ne pas le convertir en chaîne. J'ai aussi regardé bigdecimal mais ne pense pas que cela serait utile,

+0

Il existe une méthode ronde js –

+0

Je pensais que les points décimaux étaient déjà autour. Et les signes moins, plus les signes et la division étaient tous plats :) Pour "arrondir jusqu'à 100", il suffit d'utiliser "Math.round()": http://docs.oracle.com/javase/1.4.2/docs/api /java/lang/Math.html double x = rond (y/100.0) * 100.0; – paulsm4

+0

BigDecimal fonctionne très bien, vous pouvez créer une fonction ronde (nombre, décimales) comme celle de cette réponse. Essayez-le, je ne vois pas pourquoi cela ne fonctionnerait pas. http://stackoverflow.com/a/8911683/744859 –

Répondre

11

Essayez d'utiliser Math.round(double) sur le nombre après l'avoir augmenté, puis en le réduisant.

double x = 1.234; 
double y = Math.round(x * 100.0)/100.0; // => 1.23 

Vous pouvez également utiliser BigDecimal si vous voulez vraiment des poids lourds:

BigDecimal a = new BigDecimal("1.234"); 
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23") 
0

Tout d'abord, il y a des fonctions de bibliothèque pour faire ceci, alors pourquoi ne pas simplement les utiliser? Voir Math.round(). Pas besoin de réinventer la roue. Si vous le vouliez, vous pourriez essayer ce qui suit. Pour arrondir un double à la place du centième:

x = 0.01 * floor(x * 100.0) 

Pour arrondir un double à la place du dixième:

x = 0.1 * floor(x * 10.0) 

Pour arrondir un double au lieu de 10^k:

x = 10^k * floor(x/10^k) 

L'implémentation dans n'importe quelle langue - y compris Java - devrait être simple. Un problème avec ceci est qu'il ne tourne pas vraiment, mais tronque, à votre position. Pour résoudre ce problème, vous pouvez simplement ajouter 0,5 * 10^k à votre numéro avant d'arrondir. Si vous voulez juste arrondir, utilisez les versions ci-dessus, et ajoutez 10^k avant ou après le calcul.

+0

Ne voudriez-vous pas utiliser round() au lieu de floor()? Je m'attendrais à ce que 0,193 soit arrondi à 0,2 si à 1dp. –

+0

@brainzzy Je discute de la façon d'obtenir la même chose que round() et ceiling() en utilisant la primitive floor() pour les nombres base-10. Mais essentiellement, oui, s'il veut arrondir au plus proche (plutôt que toujours en haut ou toujours en bas), round() devrait fonctionner. – Patrick87

Questions connexes