web-dev-qa-db-ja.com

Doubleを小数点以下1桁に丸めますkotlin:0.044999から0.1

0.0449999であるDouble変数があり、小数点以下1桁0.1に丸めたいと思います。

Kotlinを使用していますが、Javaソリューションも役立ちます。

val number:Double = 0.0449999

次の2つのソリューションで小数点以下1桁を取得しようとしました。

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

問題は、0.04から0.0に数値を丸めるため、どちらの場合も0.0になることです。すべての小数を取得して丸めるわけではありません。

0.1を取得したい:0.045 -> 0.05 -> 0.1

17
Noelia

最後に、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

注:それがどのように機能するかではありませんが、いくつかの特別なケースではすべての小数を考慮して切り上げる必要がある場合があるので、誰かがこれを役に立つと思うかもしれません。

34
Noelia

BigDecimal 丸め機能には、 RoundingMode sが含まれます。これには、切り上げ(ゼロから遠い)または正の無限大への切り上げが含まれます。必要な場合は、次のように setScale を呼び出して丸めを実行できます。

val number = 0.0449999
val rounded = number.toBigDecimal().setScale(1, RoundingMode.UP).toDouble()
println(rounded) // 0.1

ただし、0.00.1の間のすべてを0.1に丸める方法でも機能することに注意してください(例:0.000010.1)。

.toBigDecimal() 拡張が利用可能です Kotlin 1.2以降

21
hotkey

上記のソリューションのいくつかは完全に機能することを知っていますが、ceil and floorコンセプトを使用する別のソリューションを追加したいと思います。これはすべての場合に最適化されていると思います。

10進数の後に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()
    }

10進数の後に2桁の最小値が必要な場合は、これを使用します。

ここで、1.45678 = 1.45

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

以下のような他のフラグもあります1.FLOOR 2.CEILING 3.DOWN 4.HALFDOWN 5.HALFEVEN 6.HALFUP 7.UNNECESSARY 8.UP

詳細情報は docs で提供されます

8
Gaurang Goda

1。メソッド(Noeliaのアイデアを使用):

文字列テンプレートで必要な小数点以下の桁数を渡し、この方法で精度変数を作成できます。

fun Number.roundTo(numFractionDigits: Int) 
 = String.format("%.${numFractionDigits}f", toDouble()).toDouble()

2。メソッド(数値、文字列変換なし)

fun roundToDecimals(number: Double, numDecimalPlaces: Int): Double {
    val factor = Math.pow(10.0, numDecimalPlaces.toDouble())
    return Math.round(number * factor) / factor
}
5
Willi Mentzel