Round Double 到小数点后 1 位 kotlin:从 0.044999 到 0.1

新手上路,请多包涵

我有一个 Double 变量,即 0.0449999 我想将其四舍五入到小数点后 1 位 0.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

原文由 Noelia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

注意:我知道这不是它应该如何工作的,但有时你需要在某些特殊情况下考虑所有小数,所以也许有人觉得这很有用。

原文由 Noelia 发布,翻译遵循 CC BY-SA 4.0 许可协议

我知道上面的一些解决方案工作得很好,但我想添加另一个使用 ceil 和 floor 概念的解决方案,我认为它针对所有情况进行了优化。

如果您想要小数点后 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()
}

Here a list of all available flags: CEILING , DOWN , FLOOR , HALF_DOWN , HALF_EVEN , HALF_UP , UNNECESSARY , UP

详细信息在 文档 中给出

原文由 Gaurang Goda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题