web-dev-qa-db-fra.com

Vous utilisez Math.round pour arrondir à une décimale?

J'ai ces deux variables

double num = 540.512
double sum = 1978.8

Puis j'ai fait cette expression

double total = Math.round((num/ sum * 100) * 10) / 10;

mais je me retrouve avec 27,0.

En fait, j'ai beaucoup d'autres variables et quand je les utilise dans l'expression, j'ai toujours un 0 à la place du dixième.

32
user3344542

Méthode utile que j'ai créée il y a quelque temps ...

private static double round (double value, int precision) {
    int scale = (int) Math.pow(10, precision);
    return (double) Math.round(value * scale) / scale;
}
82
jpdymond

essaye ça

par exemple

DecimalFormat df = new DecimalFormat("#.##");
df.format(55.544545);

sortie:

55.54
22
user3381763

Le Math.round La méthode retourne un long (ou un int si vous passez un float), et la division entière de Java en est la cause. Relancez-le en double ou utilisez un littéral double pour le diviser par 10. Non plus:

double total = (double) Math.round((num / sum * 100) * 10) / 10;

ou

double total = Math.round((num / sum * 100) * 10) / 10.0;

Alors vous devriez obtenir

27.3
15
rgettman
    Double toBeTruncated = new Double("2.25");

    Double truncatedDouble=new BigDecimal(toBeTruncated ).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

il retournera 2.3

13
Sankar

Si vous avez plus souvent besoin de cela et d'opérations similaires, il peut être plus pratique de trouver la bonne bibliothèque au lieu de l'implémenter vous-même.

Voici des réponses simples qui résolvent votre question d'Apache Commons Math en utilisant Precision , Colt en utilisant Fonctions , et Weka en utilisant tils :

double value = 540.512 / 1978.8 * 100;
// Apache commons math
double rounded1 = Precision.round(value, 1);
double rounded2 = Precision.round(value, 1, BigDecimal.ROUND_HALF_UP);
// Colt
double rounded3 = Functions.round(0.1).apply(value)
// Weka
double rounded4 = Utils.roundDouble(value, 1)

Dépendances Maven:

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

<dependency>
    <groupId>colt</groupId>
    <artifactId>colt</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
    <groupId>nz.ac.waikato.cms.weka</groupId>
    <artifactId>weka-stable</artifactId>
    <version>3.6.12</version>
</dependency>
11
Mifeet

Une alternative intéressante qui est beaucoup plus lisible à mon avis, cependant, peut-être un peu moins efficace en raison des conversions entre double et String:

double num = 540.512;
double sum = 1978.8;

// NOTE: This does take care of rounding
String str = String.format("%.1f", (num/sum) * 100.0); 

Si vous voulez la réponse en double, vous pouvez bien sûr la reconvertir:

double ans = Double.parseDouble(str);
4
Micah Stairs
Double number = new Double("5.25");
Double tDouble = 
  new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

cela retournera il retournera 5.3

3
sankar ganesh
DecimalFormat decimalFormat = new DecimalFormat(".#");
String result = decimalFormat.format(12.763);                // -->  12.7
2
Dan Alboteanu

Votre méthode est correcte, tout ce que vous avez à faire est d’ajouter un .0 après les dizaines et cela résoudra votre problème!

double example = Math.round((187/35) * 10.0) / 10.0;

La sortie serait:

5.3
2
user8982259