圆形双倍到1位小数kotlin:从0.044999到0.1

问题描述 投票:9回答:4

我有一个qzxswpoi的Double变量,我想将它舍入到1位小数0.0449999

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

0.1

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

  1. val number:Double = 0.0449999
  2. val solution = Math.round(number * 10.0) / 10.0

问题是我在两种情况下都得到0.0,因为它将数字从val solution = String.format("%.1f", number)舍入到0.04。它不会取所有小数并将其舍入。

我想获得0.1:0.0

java android kotlin rounding
4个回答
33
投票

最后我做了0.045 -> 0.05 -> 0.1建议的内容,四舍五入到3位小数,然后到2然后再到1:

答案1:

Andy Turner

答案2:

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

结果:

0.045 → 0.05 → 0.1

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


20
投票

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 四舍五入有几个BigDecimals,包括那些向上舍入(远离零)或向正无穷大。如果这就是您所需要的,您可以通过调用RoundingMode执行舍入,如下所示:

setScale

但是,请注意,它的工作方式也会使val number = 0.0449999 val rounded = number.toBigDecimal().setScale(1, RoundingMode.UP).toDouble() println(rounded) // 0.1 0.0之间的任何内容变为0.1(例如0.10.00001)。

0.1扩展可用.toBigDecimal()


8
投票

我知道上面的一些解决方案完美无缺,但我想添加另一个使用ceil和floor概念的解决方案,我认为这个解决方案针对所有情况进行了优化。

如果你想要小数点后2位数的最高值使用它。

since Kotlin 1.2

这里,1.45678 = 1.46

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

如果你想要小数点后2位数的最小值使用它。

这里,1.45678 = 1.45

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

还有其他旗帜如下1.FLOOR 2.CEILING 3.DOWN 4.HALFDOWN 5.HALFEVEN 6.HALFUP 7.UNNECESSARY 8.UP

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


5
投票

1.方法(使用Noelia的想法):

您可以在字符串模板中传递所需的小数位数,并以这种方式使精度变量:

docs

2.方法(数字,无字符串转换)

fun Number.roundTo(numFractionDigits: Int) 
 = String.format("%.${numFractionDigits}f", toDouble()).toDouble()
© www.soinside.com 2019 - 2024. All rights reserved.