Solución:
Finalmente hice lo que Andy Turner
sugerido, redondeado a 3 decimales, luego a 2 y luego a 1:
Respuesta 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()
Respuesta 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
Resultado:
0,045 → 0,05 → 0,1
Nota: Sé que no es así como debería funcionar, pero a veces es necesario redondear teniendo en cuenta todos los decimales para algunos casos especiales, por lo que tal vez alguien lo encuentre útil.
los BigDecimal
redondeo características varias RoundingMode
s, incluidos los que se redondean hacia arriba (desde cero) o hacia el infinito positivo. Si eso es lo que necesita, puede realizar el redondeo llamando setScale
como sigue:
val number = 0.0449999
val rounded = number.toBigDecimal().setScale(1, RoundingMode.UP).toDouble()
println(rounded) // 0.1
Tenga en cuenta, sin embargo, que funciona de una manera que también redondeará cualquier cosa entre 0.0
y 0.1
para 0.1
(p.ej 0.00001
→ 0.1
).
los .toBigDecimal()
La extensión está disponible desde Kotlin 1.2.
Sé que algunas de las soluciones anteriores funcionan perfectamente, pero quiero agregar otra solución que utiliza el concepto de techo y piso, que creo que está optimizado para todos los casos.
Si desea el valor más alto de los 2 dígitos después del decimal, use el siguiente código.
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat
aquí, 1,45678 = 1,46
fun roundOffDecimal(number: Double): Double? {
val df = DecimalFormat("#.##")
df.roundingMode = RoundingMode.CEILING
return df.format(number).toDouble()
}
Si desea el valor más bajo de los 2 dígitos después del decimal, utilice el siguiente código.
aquí, 1,45678 = 1,45
fun roundOffDecimal(number: Double): Double? {
val df = DecimalFormat("#.##")
df.roundingMode = RoundingMode.FLOOR
return df.format(number).toDouble()
}
Aquí una lista de todas las banderas disponibles: CEILING
, DOWN
, FLOOR
, HALF_DOWN
, HALF_EVEN
, HALF_UP
, UNNECESSARY
, UP
La información detallada se da en los documentos.