wake-up-neo.com

Round Double auf 1 Dezimalstelle kotlin: von 0,044999 bis 0,1

Ich habe eine Double-Variable, die 0.0449999 ist, und ich möchte sie auf 1 Dezimalstelle 0.1 runden.

Ich benutze Kotlin, aber die Java-Lösung ist auch hilfreich.

val number:Double = 0.0449999

Ich habe versucht, mit diesen beiden Lösungen eine Dezimalstelle zu erhalten:

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

Das Problem ist, dass ich in beiden Fällen 0.0 bekomme, weil die Zahl von 0.04 auf 0.0 gerundet wird. Es werden nicht alle Dezimalstellen benötigt und gerundet.

Ich möchte 0.1 erhalten: 0.045 -> 0.05 -> 0.1

5
Noelia

Schließlich tat ich, was Andy Turner vorschlug, auf 3 Dezimalstellen gerundet, dann auf 2 und dann auf 1:

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

Antwort 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

Ergebnis

0,045 → 0,05 → 0,1

Hinweis: Ich weiß, dass es nicht so ist, wie es funktionieren sollte, aber manchmal müssen Sie für einige Sonderfälle alle Dezimalzahlen berücksichtigen. Vielleicht findet dies jemand nützlich.

15
Noelia

Die BigDecimal Rundung umfasst mehrere RoundingMode s, einschließlich der Abrundung (von Null weg) oder in Richtung der positiven Unendlichkeit. Wenn Sie das benötigen, können Sie eine Rundung durchführen, indem Sie setScale wie folgt aufrufen:

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

Beachten Sie jedoch, dass dies so funktioniert, dass auch alles zwischen 0.0 und 0.1 auf 0.1 (z. B. 0.000010.1) gerundet wird.

Die Erweiterung .toBigDecimal() ist seit Kotlin 1.2 verfügbar.

7
hotkey

1. Methode (nach Noelias Idee):

Sie können die Anzahl der gewünschten Dezimalstellen in einer Zeichenfolgenvorlage übergeben und die Genauigkeitsvariable folgendermaßen ändern:

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

2. Methode (numerisch, keine String-Konvertierung)

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

Ich weiß, dass einige der oben genannten Lösungen perfekt funktionieren, aber ich möchte eine weitere Lösung hinzufügen, die ein Ceiling- und Bodenkonzept verwendet, das meines Erachtens für alle Fälle optimiert ist.

Wenn Sie den höchsten Wert der 2 Ziffern nach Dezimalstellen verwenden möchten, verwenden Sie diesen Wert.

hier 1.45678 = 1.46

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

Wenn Sie den niedrigsten Wert der 2 Ziffern nach Dezimalstellen verwenden möchten, verwenden Sie diesen Wert.

hier 1.45678 = 1.45

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

Es gibt auch andere Flags wie unten 1.FLOOR 2.CEILING 3.DOWN 4.HALFDOWN 5.HALFEVEN .7.UNNECESSARY 8.UP

Die ausführlichen Informationen finden Sie in docs

0
Gaurang Goda