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:
val solution = Math.round(number * 10.0) / 10.0
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
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.
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.00001
→ 0.1
).
L'extension .toBigDecimal()
est disponible depuis Kotlin 1.2 .
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
}
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