将双精度四舍五入到小数点后 1 位 kotlin:从 0.044999 到 0.1

2022-08-31 11:26:08

我有一个双精度值,我想把它四舍五入到小数点后1位。0.04499990.1

我正在使用Kotlin,但Java解决方案也很有帮助。

val number:Double = 0.0449999

我尝试用这两种解决方案获得1位小数:

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

问题是,在这两种情况下,我都得到0.0,因为它将数字从舍入为。它不需要所有小数并四舍五入。0.040.0

我想得到0.1:0.045 -> 0.05 -> 0.1


答案 1

最后,我做了建议,四舍五入到3位小数,然后是2,然后是1:Andy Turner

回答 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()

回答 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

结果

0.045 → 0.05 → 0.1

注意:我知道这不是它应该如何工作,但有时您需要四舍五入,考虑到某些特殊情况下的所有小数,所以也许有人发现这很有用。


答案 2

我知道上述一些解决方案可以完美地工作,但我想添加另一个使用ceil和地板概念的解决方案,我认为这已经针对所有情况进行了优化。

如果你想要十进制后2位数字的最大值,请使用下面的代码。

import java.math.BigDecimal 
import java.math.RoundingMode
import java.text.DecimalFormat

这里,1.45678 = 1.46

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

如果你想要十进制后2位数字的最小值,请使用下面的代码。

这里,1.45678 = 1.45

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

以下是所有可用标志的列表:、 、 、 、CEILINGDOWNFLOORHALF_DOWNHALF_EVENHALF_UPUNNECESSARYUP

详细信息在文档中给出