Es ist ein paar Tage her, seit ich angefangen habe, Kotlin als Hobby zu benutzen, und ich bin beeindruckt von der sorgfältigen Unterstützung für Javas Juckreiz. BigDecimal-Arithmetik ist eine davon.
In Geschäftsanwendungen sind häufig numerische Vorgänge erforderlich, Double ist jedoch nicht verwendbar. Daher ist BigDecimal eine Option. Dieser BigDecimal-Vorgang ist äußerst unlesbar.
BigDecimalBasicSample.kt
/**
* BigDecimal coding style : (a + b) / 2
*/
fun main(args: Array<String>) {
val a = BigDecimal.ONE
val b = BigDecimal.TEN
// Java style
println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.HALF_EVEN))
// Kotlin basic style
println((a + b) / 2.toBigDecimal())
}
Java ist schrecklich. Kotlin ist sehr einfach zu lesen, da es arithmetische Operatoren mit vier Regeln anwenden kann, aber "2.toBigDecimal ()" bleibt immer noch unzufrieden.
BigDecimalCustomSample.kt
/** custome operator BigDecimal / Long */
operator fun BigDecimal.div(other : Long) : BigDecimal = this / other.toBigDecimal()
/**
* BigDecimal coding style : (a + b) / 2
*/
fun main(args: Array<String>) {
val a = BigDecimal.ONE
val b = BigDecimal.TEN
// Java style
println(a.add(b).divide(BigDecimal.valueOf(2L), RoundingMode.UP))
// Kotlin custom oeprator style
println((a + b) / 2)
}
Durch die Implementierung des ursprünglichen Operators von "BigDecimal / Long" wurde die Lesbarkeit verbessert.
In Kotlin entsprechen Operatoren dem Aufruf einer bestimmten Methode. In Operator overloading sind jeder Operator und seine entsprechenden Die Vorgehensweise wird gezeigt. Das Folgende ist ein Auszug aus dem Operator mit vier Regeln.
Expression | Translated to |
---|---|
a + b |
a.plus(b) |
a - b |
a.minus(b) |
a * b |
a.times(b) |
a / b |
a.div(b) |
a % b |
a.rem(b) , a.mod(b) (deprecated) |
a..b |
a.rangeTo(b) |
Durch die Implementierung von Methoden wie "Plus" mit "Operator Fun" können Sie Ihre eigenen Operatoren zwischen beliebigen Klassen definieren.
Die Operator-Implementierung ist in BigDecimals.kt in kotlin-stdlib enthalten. Es wird beschrieben. Auszug aus der Implementierung der Division "/" als Beispiel. Sie können sehen, dass "BigDecimal # divid" verwendet wird und "RoundingMode.HALF_EVEN" als Argument verwendet wird.
BigDecimals.kt
/**
* Enables the use of the `/` operator for [BigDecimal] instances.
*
* The scale of the result is the same as the scale of `this` (divident), and for rounding the [RoundingMode.HALF_EVEN]
* rounding mode is used.
*/
@kotlin.internal.InlineOnly
public inline operator fun BigDecimal.div(other: BigDecimal): BigDecimal = this.divide(other, RoundingMode.HALF_EVEN)
Recommended Posts