我有一个qzxswpoi的Double变量,我想将它舍入到1位小数0.0449999
。
我正在使用Kotlin,但Java解决方案也很有帮助。
0.1
我尝试使用这两个解决方案获得1位小数:
val number:Double = 0.0449999
val solution = Math.round(number * 10.0) / 10.0
问题是我在两种情况下都得到0.0,因为它将数字从val solution = String.format("%.1f", number)
舍入到0.04
。它不会取所有小数并将其舍入。
我想获得0.1:0.0
最后我做了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
注意:我知道它不应该如何工作但有时你需要考虑到一些特殊情况下考虑所有小数,所以也许有人觉得这很有用。
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
四舍五入有几个BigDecimal
s,包括那些向上舍入(远离零)或向正无穷大。如果这就是您所需要的,您可以通过调用RoundingMode
执行舍入,如下所示:
setScale
但是,请注意,它的工作方式也会使val number = 0.0449999
val rounded = number.toBigDecimal().setScale(1, RoundingMode.UP).toDouble()
println(rounded) // 0.1
和0.0
之间的任何内容变为0.1
(例如0.1
→0.00001
)。
0.1
扩展可用.toBigDecimal()
。
我知道上面的一些解决方案完美无缺,但我想添加另一个使用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()
}
1.方法(使用Noelia的想法):
您可以在字符串模板中传递所需的小数位数,并以这种方式使精度变量:
docs
2.方法(数字,无字符串转换)
fun Number.roundTo(numFractionDigits: Int)
= String.format("%.${numFractionDigits}f", toDouble()).toDouble()