diff --git a/measure/src/main/kotlin/com/alliander/open/measure/Measure.kt b/measure/src/main/kotlin/com/alliander/open/measure/Measure.kt index 3147128..13da166 100644 --- a/measure/src/main/kotlin/com/alliander/open/measure/Measure.kt +++ b/measure/src/main/kotlin/com/alliander/open/measure/Measure.kt @@ -47,7 +47,7 @@ data class Measure(val amount: BigDecimal, val units: U) : Comparable infix fun `in`(other: A): BigDecimal = if (units == other) amount - else (amount * units.ratio).divide(other.ratio, amount.scale() + units.ratio.precision(), RoundingMode.UP) + else (amount * units.ratio).divide(other.ratio, amount.scale() + other.ratio.precision(), RoundingMode.UP) operator fun plus(other: Measure): Measure = baseUnits( units, diff --git a/measure/src/test/kotlin/com/alliander/open/measure/MeasureTest.kt b/measure/src/test/kotlin/com/alliander/open/measure/MeasureTest.kt index 28866db..996feb0 100644 --- a/measure/src/test/kotlin/com/alliander/open/measure/MeasureTest.kt +++ b/measure/src/test/kotlin/com/alliander/open/measure/MeasureTest.kt @@ -218,4 +218,18 @@ class MeasureTest : StringSpec({ result shouldBe expectedResult } + + "Unit conversion uses the correct scale" { + val energyInJoule = 13500000 * joule + val valueInKwh = energyInJoule `in` kiloWattHour + valueInKwh.stripTrailingZeros() shouldBe BigDecimal.valueOf(3.75) + + val energyInJoule2 = 3.75 * kiloWattHour + val valueInKwh2 = energyInJoule2 `in` joule + valueInKwh2.stripTrailingZeros() shouldBe BigDecimal.valueOf(1.35E+7) + + val powerInW = 1.99E7 * watt + val valueInMw = powerInW `as` megaWatt + valueInMw.amount.stripTrailingZeros() shouldBe BigDecimal.valueOf(19.9) + } })