web-dev-qa-db-fra.com

Rond Double à 1 décimale kotlin: de 0,044999 à 0,1

J'ai une variable Double qui est 0.0449999 et je voudrais l'arrondir à 1 décimale 0.1.

J'utilise Kotlin mais la solution Java est également utile.

val number:Double = 0.0449999

J'ai essayé d'obtenir 1 décimale avec ces deux solutions:

  1. val solution = Math.round(number * 10.0) / 10.0
  2. val solution = String.format("%.1f", number)

Le problème est que je reçois 0.0 dans les deux cas car il arrondit le nombre de 0.04 à 0.0. Il ne prend pas toutes les décimales et l’entoure.

Je voudrais obtenir 0.1: 0.045 -> 0.05 -> 0.1

5
Noelia

Finalement, j'ai fait ce que Andy Turner a suggéré, arrondi à 3 décimales, puis à 2 et ensuite à 1:

Réponse 1:

val number:Double = 0.0449999
val number3digits:Double = String.format("%.3f", number).toDouble()
val number2digits:Double = String.format("%.2f", number3digits).toDouble()
val solution:Double = String.format("%.1f", number2digits).toDouble()

Réponse 2:

val number:Double = 0.0449999
val number3digits:Double = Math.round(number * 1000.0) / 1000.0
val number2digits:Double = Math.round(number3digits * 100.0) / 100.0
val solution:Double = Math.round(number2digits * 10.0) / 10.0

Résultat

0,045 → 0,05 → 0,1

Remarque: Je sais que ce n'est pas comme cela que cela devrait fonctionner, mais parfois, vous devez arrondir en tenant compte de tous les nombres décimaux pour certains cas particuliers, alors peut-être que cela vous sera utile.

15
Noelia

L’arrondissement BigDecimal comporte plusieurs RoundingMode , y compris ceux arrondis (vers le haut) ou vers l’infini positif. Si c'est ce dont vous avez besoin, vous pouvez arrondir en appelant setScale comme suit:

val number = 0.0449999
val rounded = number.toBigDecimal().setScale(1, RoundingMode.UP).toDouble()
println(rounded) // 0.1

Notez, cependant, que cela fonctionne de manière à arrondir tout ce qui va entre 0.0 et 0.1 à 0.1 (par exemple 0.000010.1).

L'extension .toBigDecimal() est disponible depuis Kotlin 1.2 .

7
hotkey

1. Méthode (utilisant l'idée de Noelia):

Vous pouvez indiquer le nombre de décimales souhaitées dans un modèle de chaîne et définir la variable de précision de la manière suivante:

fun Number.roundTo(numFractionDigits: Int) 
 = String.format("%.${numFractionDigits}f", toDouble()).toDouble()

2. Méthode (numérique, pas de conversion de chaîne)

fun roundToDecimals(number: Double, numDecimalPlaces: Int): Double {
    val factor = Math.pow(10.0, numDecimalPlaces.toDouble())
    return Math.round(number * factor) / factor
}
3
Willi Mentzel

Je sais que certaines des solutions ci-dessus fonctionnent parfaitement, mais je souhaite ajouter une autre solution qui utilise le concept de plafond et plancher, qui, à mon avis, est optimisé pour tous les cas.

Si vous voulez que la valeur la plus élevée des 2 chiffres après la décimale l'utilise.

ici, 1.45678 = 1.46

fun roundOffDecimal(number: Double): Double? {
        val df = DecimalFormat("#.##")
        df.roundingMode = RoundingMode.CEILING
        return df.format(number).toDouble()
    }

Si vous voulez la valeur la plus basse des 2 chiffres après la décimale, utilisez ceci.

ici, 1.45678 = 1.45

fun roundOffDecimal(number: Double): Double? {
        val df = DecimalFormat("#.##")
        df.roundingMode = RoundingMode.FLOOR
        return df.format(number).toDouble()
    }

Il y a aussi d'autres drapeaux comme ci-dessous 1.FLOOR 2.CEILING 3.DOWN 4. HALFDOWN 5.HALFEVEN 6.HALFUP 7.UNNECESSARY 8.UP

Les informations détaillées sont données dans docs

0
Gaurang Goda