package de.invesdwin.util.math.decimal; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.annotation.concurrent.ThreadSafe; import org.junit.Test; import de.invesdwin.util.assertions.Assertions; @ThreadSafe public class DecimalTest { @Test public void testGrowthRate() { Assertions.assertThat(Decimal.ONE.growthRate(Decimal.TWO).toString()).isEqualTo("1"); Assertions.assertThat(Decimal.ONE.growthRate(Decimal.TWO)).isEqualTo(new Decimal("1")); Assertions.assertThat(Decimal.MINUS_ONE.growthRate(Decimal.TWO).toString()).isEqualTo("3"); Assertions.assertThat(Decimal.MINUS_ONE.growthRate(Decimal.TWO)).isEqualTo(new Decimal("3")); Assertions.assertThat(Decimal.ONE.growthRate(Decimal.MINUS_TWO).toString()).isEqualTo("-3"); Assertions.assertThat(Decimal.ONE.growthRate(Decimal.MINUS_TWO)).isEqualTo(new Decimal("-3")); Assertions.assertThat(Decimal.MINUS_ONE.growthRate(Decimal.MINUS_TWO).toString()).isEqualTo("-1"); Assertions.assertThat(Decimal.MINUS_ONE.growthRate(Decimal.MINUS_TWO)).isEqualTo(new Decimal("-1")); Assertions.assertThat(Decimal.TWO.growthRate(Decimal.ONE).toString()).isEqualTo("-0.5"); Assertions.assertThat(Decimal.TWO.growthRate(Decimal.ONE)).isEqualTo(new Decimal("-0.5")); Assertions.assertThat(Decimal.MINUS_TWO.growthRate(Decimal.ONE).toString()).isEqualTo("1.5"); Assertions.assertThat(Decimal.MINUS_TWO.growthRate(Decimal.ONE)).isEqualTo(new Decimal("1.5")); Assertions.assertThat(Decimal.TWO.growthRate(Decimal.MINUS_ONE).toString()).isEqualTo("-1.5"); Assertions.assertThat(Decimal.TWO.growthRate(Decimal.MINUS_ONE)).isEqualTo(new Decimal("-1.5")); Assertions.assertThat(Decimal.MINUS_TWO.growthRate(Decimal.MINUS_ONE).toString()).isEqualTo("0.5"); Assertions.assertThat(Decimal.MINUS_TWO.growthRate(Decimal.MINUS_ONE)).isEqualTo(new Decimal("0.5")); } @Test public void testMultiply() { Assertions.assertThat(new Decimal("13191").multiply(new Decimal("1352255913000")).toString()) .isIn("17837607748383000", /* double imprecision adds 2 */"17837607748383002"); Assertions.assertThat(new Decimal("13191").multiply(new Decimal("1352255913000"))).isIn( new Decimal("17837607748383000"), /* double imprecision adds 2 */new Decimal("17837607748383002")); } @Test public void testDivide() { Assertions.assertThat(new Decimal("1").divide(new Decimal("3")).toString()).isEqualTo("0.333333333"); Assertions.assertThat(new Decimal("1").divide(new Decimal("3"))).isEqualTo(new Decimal("0.333333333")); Assertions.assertThat(new Decimal("0").divide(new Decimal("3"))).isEqualTo(new Decimal("0")); } @Test public void testPow() { Assertions.assertThat(Decimal.TWO.pow(2).toString()).isEqualTo("4"); Assertions.assertThat(Decimal.TWO.pow(2)).isEqualTo(new Decimal("4")); Assertions.assertThat(Decimal.TWO.pow(3).toString()).isEqualTo("8"); Assertions.assertThat(Decimal.TWO.pow(3)).isEqualTo(new Decimal("8")); Assertions.assertThat(new Decimal("-1000").pow(new Decimal("-0.1"))).isEqualTo(new Decimal("-0.501187234")); Assertions.assertThat(new Decimal("-1000").pow(new Decimal("0.1"))).isEqualTo(new Decimal("-1.995262315")); Assertions.assertThat(new Decimal("1000").pow(new Decimal("-0.1"))).isEqualTo(new Decimal("0.501187234")); Assertions.assertThat(new Decimal("1000").pow(new Decimal("0.1"))).isEqualTo(new Decimal("1.995262315")); Assertions.assertThat(new Decimal("-1000").pow(new Decimal("-0.2"))).isEqualTo(new Decimal("-0.251188643")); Assertions.assertThat(new Decimal("-1000").pow(new Decimal("0.2"))).isEqualTo(new Decimal("-3.981071706")); Assertions.assertThat(new Decimal("1000").pow(new Decimal("-0.2"))).isEqualTo(new Decimal("0.251188643")); Assertions.assertThat(new Decimal("1000").pow(new Decimal("0.2"))).isEqualTo(new Decimal("3.981071706")); Assertions.assertThat(new Decimal("-10").pow(new Decimal("-10"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("-10").pow(new Decimal("10"))).isEqualTo(new Decimal("10000000000")); Assertions.assertThat(new Decimal("10").pow(new Decimal("-10"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("10").pow(new Decimal("10"))).isEqualTo(new Decimal("10000000000")); Assertions.assertThat(new Decimal("-9").pow(new Decimal("-10"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("-9").pow(new Decimal("10"))).isEqualTo(new Decimal("3486784401")); Assertions.assertThat(new Decimal("9").pow(new Decimal("-10"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("9").pow(new Decimal("10"))).isEqualTo(new Decimal("3486784401")); Assertions.assertThat(new Decimal("-10").pow(new Decimal("-9"))).isEqualTo(new Decimal("-0.000000001")); Assertions.assertThat(new Decimal("-10").pow(new Decimal("9"))).isEqualTo(new Decimal("-1000000000")); Assertions.assertThat(new Decimal("10").pow(new Decimal("-9"))).isEqualTo(new Decimal("0.000000001")); Assertions.assertThat(new Decimal("10").pow(new Decimal("9"))).isEqualTo(new Decimal("1000000000")); Assertions.assertThat(new Decimal("-0.01").pow(new Decimal("-0.1"))).isEqualTo(new Decimal("-1.584893192")); Assertions.assertThat(new Decimal("-0.01").pow(new Decimal("0.1"))).isEqualTo(new Decimal("-0.630957344")); Assertions.assertThat(new Decimal("0.01").pow(new Decimal("-0.1"))).isEqualTo(new Decimal("1.584893192")); Assertions.assertThat(new Decimal("0.01").pow(new Decimal("0.1"))).isEqualTo(new Decimal("0.630957344")); } @Test public void testOrLowerOrHigher() { Assertions.assertThat(Decimal.TWO.orLower(Decimal.ONE)).isEqualByComparingTo(Decimal.ONE); Assertions.assertThat(Decimal.TWO.orLower(Decimal.THREE)).isEqualByComparingTo(Decimal.TWO); Assertions.assertThat(Decimal.TWO.orHigher(Decimal.ONE)).isEqualByComparingTo(Decimal.TWO); Assertions.assertThat(Decimal.TWO.orHigher(Decimal.THREE)).isEqualByComparingTo(Decimal.THREE); } @Test public void testAvgGrowthRateUp() { final List<Decimal> values = new ArrayList<Decimal>(); values.add(Decimal.ONE); values.add(Decimal.TWO); values.add(Decimal.THREE); values.add(new Decimal("4")); values.add(new Decimal("5")); final IDecimalAggregate<Decimal> growthRates = Decimal.valueOf(values).growthRates(); Assertions.assertThat(growthRates.toString()).isEqualTo("[1, 0.5, 0.333333333, 0.25]"); final List<Decimal> expectedList = Arrays.asList(new Decimal("1"), new Decimal("0.5"), new Decimal("0.333333333"), new Decimal("0.25")); Assertions.assertThat(Decimal.valueOf(values).growthRates().values().size()) .isEqualTo(growthRates.values().size()); for (int i = 0; i < expectedList.size(); i++) { Assertions.assertThat(growthRates.values().get(i)).isEqualTo(expectedList.get(i)); } Assertions.assertThat(growthRates.values()).isEqualTo(expectedList); final Decimal avg = Decimal.valueOf(values).growthRates().avg(); Assertions.assertThat(avg.toString()).isEqualTo("0.5208333333333333"); Assertions.assertThat(avg).isEqualTo(new Decimal("0.5208333333333333")); Assertions.assertThat(values.get(0).growthRate(values.get(values.size() - 1)).toString()).isEqualTo("4"); Assertions.assertThat(values.get(0).growthRate(values.get(values.size() - 1))).isEqualTo(new Decimal("4")); } @Test public void testRoundToStep() { Assertions.assertThat(new Decimal("0.2").roundToStep(new Decimal("0.5")).toString()).isEqualTo("0"); Assertions.assertThat(new Decimal("0.2").roundToStep(new Decimal("0.5"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("1.2").roundToStep(new Decimal("0.5")).toString()).isEqualTo("1"); Assertions.assertThat(new Decimal("1.2").roundToStep(new Decimal("0.5"))).isEqualTo(new Decimal("1")); Assertions.assertThat(new Decimal("2.3").roundToStep(new Decimal("0.5")).toString()).isEqualTo("2.5"); Assertions.assertThat(new Decimal("2.3").roundToStep(new Decimal("0.5"))).isEqualTo(new Decimal("2.5")); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.2")).toString()).isEqualTo("0.2"); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.2"))).isEqualTo(new Decimal("0.2")); Assertions.assertThat(new Decimal("0.0").roundToStep(new Decimal("0.2")).toString()).isEqualTo("0"); Assertions.assertThat(new Decimal("0.0").roundToStep(new Decimal("0.2"))).isEqualTo(new Decimal("0")); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.1")).toString()).isEqualTo("0.1"); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.1"))).isEqualTo(new Decimal("0.1")); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.1"), RoundingMode.FLOOR).toString()) .isEqualTo("0.1"); Assertions.assertThat(new Decimal("0.1").roundToStep(new Decimal("0.1"), RoundingMode.FLOOR)) .isEqualTo(new Decimal("0.1")); } @Test public void testReciprocal() { Assertions.assertThat(new Decimal("1").reciprocal().toString()).isEqualTo("1"); Assertions.assertThat(new Decimal("2").reciprocal().toString()).isEqualTo("0.5"); } @Test public void testGeomAvg() { final List<Decimal> values = new ArrayList<Decimal>(); for (int i = 0; i < 3000; i++) { values.add(new Decimal("5")); values.add(new Decimal("20")); values.add(new Decimal("40")); values.add(new Decimal("80")); values.add(new Decimal("100")); } final Decimal geomAvg = Decimal.valueOf(values).geomAvg(); System.out.println(String.format("%s", geomAvg)); //SUPPRESS CHECKSTYLE single line Assertions.assertThat(geomAvg.toString()).startsWith("31.69"); } @Test public void testRoot() { Assertions.assertThat(Decimal.TWO.root(3).toString()).startsWith("1.25"); Assertions.assertThat(new Decimal("3795629787000").root(2).toString()).startsWith("1948237.6"); } @Test public void testSqrt() { Assertions.assertThat(Decimal.TWO.sqrt().toString()).startsWith("1.4142"); Assertions.assertThat(new Decimal("3795629787000").sqrt().toString()).startsWith("1948237.6"); } @Test public void testRoundPositive() { Assertions.assertThat(new Decimal("3795629787000").round(2).toString()).isEqualTo("3795629787000"); Assertions.assertThat(new Decimal("3795629787000").round(2)).isEqualTo(new Decimal("3795629787000")); Assertions.assertThat(new Decimal("37.95629787000").round(2).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.95629787000").round(2)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.UP).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.UP)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.UP).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.UP)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.UP).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.UP)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.CEILING).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.CEILING).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.CEILING).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.DOWN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.DOWN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.DOWN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.FLOOR).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.FLOOR).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.FLOOR).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.95"); Assertions.assertThat(new Decimal("37.954").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.95")); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.955").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.956").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.964").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.964").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.965").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.96"); Assertions.assertThat(new Decimal("37.965").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.96")); Assertions.assertThat(new Decimal("37.966").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("37.97"); Assertions.assertThat(new Decimal("37.966").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("37.97")); Assertions.assertThat(new Decimal("37.95629787000").round(2, RoundingMode.UNNECESSARY).toString()) .isEqualTo("37.95629787"); Assertions.assertThat(new Decimal("37.95629787000").round(2, RoundingMode.UNNECESSARY)) .isEqualTo(new Decimal("37.95629787000")); } @Test public void testRoundNegative() { Assertions.assertThat(new Decimal("-3795629787000").round(2).toString()).isEqualTo("-3795629787000"); Assertions.assertThat(new Decimal("-3795629787000").round(2)).isEqualTo(new Decimal("-3795629787000")); Assertions.assertThat(new Decimal("-37.95629787000").round(2).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.95629787000").round(2)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.UP).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.UP)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.UP).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.UP)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.UP).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.UP)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.CEILING).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.CEILING).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.CEILING).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.CEILING)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_UP).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_UP)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.DOWN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.DOWN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.DOWN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.DOWN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.FLOOR).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.FLOOR).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.FLOOR).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.FLOOR)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_DOWN).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_DOWN)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.95"); Assertions.assertThat(new Decimal("-37.954").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.95")); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.955").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.956").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.964").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.964").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.965").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.96"); Assertions.assertThat(new Decimal("-37.965").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.96")); Assertions.assertThat(new Decimal("-37.966").round(2, RoundingMode.HALF_EVEN).toString()).isEqualTo("-37.97"); Assertions.assertThat(new Decimal("-37.966").round(2, RoundingMode.HALF_EVEN)).isEqualTo(new Decimal("-37.97")); Assertions.assertThat(new Decimal("-37.95629787000").round(2, RoundingMode.UNNECESSARY).toString()) .isEqualTo("-37.95629787"); Assertions.assertThat(new Decimal("-37.95629787000").round(2, RoundingMode.UNNECESSARY)) .isEqualTo(new Decimal("-37.95629787000")); } @Test public void testGetDigits() { Assertions.assertThat(new BigDecimal("37.95629787000").stripTrailingZeros().precision()).isEqualTo(10); Assertions.assertThat(new Decimal("37.95629787000").getDigits()).isEqualTo(10); Assertions.assertThat(new BigDecimal("0.95629787000").stripTrailingZeros().precision()).isEqualTo(8); Assertions.assertThat(new Decimal("0.95629787000").getDigits()).isEqualTo(9); Assertions.assertThat(new BigDecimal("0").stripTrailingZeros().precision()).isEqualTo(1); Assertions.assertThat(new Decimal("0").getDigits()).isEqualTo(1); Assertions.assertThat(new BigDecimal("0.01").stripTrailingZeros().precision()).isEqualTo(1); Assertions.assertThat(new Decimal("0.01").getDigits()).isEqualTo(3); } @Test public void testGetDecimalDigits() { Assertions.assertThat(new BigDecimal("37.95629787000").stripTrailingZeros().scale()).isEqualTo(8); Assertions.assertThat(new Decimal("37.95629787000").getDecimalDigits()).isEqualTo(8); Assertions.assertThat(new BigDecimal("0.95629787000").stripTrailingZeros().scale()).isEqualTo(8); Assertions.assertThat(new Decimal("0.95629787000").getDecimalDigits()).isEqualTo(8); Assertions.assertThat(new BigDecimal("0").stripTrailingZeros().scale()).isEqualTo(0); Assertions.assertThat(new Decimal("0").getDecimalDigits()).isEqualTo(0); Assertions.assertThat(new BigDecimal("0.01").stripTrailingZeros().scale()).isEqualTo(2); Assertions.assertThat(new Decimal("0.01").getDecimalDigits()).isEqualTo(2); } @Test public void testGetWholeNumberDigits() { final BigDecimal bd = new BigDecimal("37.95629787000").stripTrailingZeros(); Assertions.assertThat(bd.precision() - bd.scale()).isEqualTo(2); Assertions.assertThat(new Decimal("37.95629787000").getWholeNumberDigits()).isEqualTo(2); final BigDecimal bdZeroPoint = new BigDecimal("0.95629787000").stripTrailingZeros(); Assertions.assertThat(bdZeroPoint.precision() - bdZeroPoint.scale()).isEqualTo(0); Assertions.assertThat(new Decimal("0.95629787000").getWholeNumberDigits()).isEqualTo(1); final BigDecimal bdZero = new BigDecimal("0").stripTrailingZeros(); Assertions.assertThat(bdZero.precision() - bdZero.scale()).isEqualTo(1); Assertions.assertThat(new Decimal("0").getWholeNumberDigits()).isEqualTo(1); final BigDecimal bd001 = new BigDecimal("0.01").stripTrailingZeros(); Assertions.assertThat(bd001.precision() - bdZero.scale()).isEqualTo(1); Assertions.assertThat(new Decimal("0.01").getWholeNumberDigits()).isEqualTo(1); } @Test public void testEquals() { Assertions.assertThat(new Decimal("9.536743164E-7").toString()) .isEqualTo(new Decimal("0.0000009536743164").toString()); Assertions.assertThat(new Decimal("9.536743164E-7")).isEqualTo(new Decimal("0.0000009536743164")); } @Test public void testScaleByPowerOfTen() { final Decimal scaled100 = new Decimal("1").scaleByPowerOfTen(2); Assertions.assertThat(scaled100.toString()).isEqualTo("100"); Assertions.assertThat(scaled100).isEqualTo(new Decimal("100")); Assertions.assertThat(scaled100.getDigits()).isEqualTo(3); Assertions.assertThat(scaled100.getWholeNumberDigits()).isEqualTo(3); Assertions.assertThat(scaled100.getDecimalDigits()).isEqualTo(0); final Decimal scaled001 = new Decimal("1").scaleByPowerOfTen(-2); Assertions.assertThat(scaled001.toString()).isEqualTo("0.01"); Assertions.assertThat(scaled001).isEqualTo(new Decimal("0.01")); Assertions.assertThat(scaled001.getWholeNumberDigits()).isEqualTo(1); Assertions.assertThat(scaled001.getDecimalDigits()).isEqualTo(2); Assertions.assertThat(scaled001.getDigits()).isEqualTo(3); } @Test public void testDetrendAbsolutePositiveToNegative() { final List<Decimal> values = new ArrayList<Decimal>(); for (int i = 10; i >= -10; i--) { values.add(new Decimal(i)); } final List<Decimal> detrended = Decimal.valueOf(values).detrendAbsolute().values(); //CHECKSTYLE:OFF System.out.println(values + " " + Decimal.valueOf(values).growthRates().avg()); System.out.println(detrended + " " + Decimal.valueOf(detrended).growthRates().avg()); //CHECKSTYLE:ON } @Test public void testDetrendAbsolutePositive() { final List<Decimal> values = new ArrayList<Decimal>(); for (int i = 10; i >= 0; i--) { values.add(new Decimal(i)); } final List<Decimal> detrended = Decimal.valueOf(values).detrendAbsolute().values(); //CHECKSTYLE:OFF System.out.println(values + " " + Decimal.valueOf(values).growthRates().avg()); System.out.println(detrended + " " + Decimal.valueOf(detrended).growthRates().avg()); //CHECKSTYLE:ON } @Test public void testDetrendRelativePositiveToNegative() { final List<Decimal> values = new ArrayList<Decimal>(); for (int i = 100; i < 120; i++) { values.add(new Decimal(i)); } final List<Decimal> detrended = Decimal.valueOf(values).detrendRelative().values(); final List<Decimal> detrendedWithAbsolute = Decimal.valueOf(detrended).detrendAbsolute().values(); //CHECKSTYLE:OFF System.out.println(values + " " + Decimal.valueOf(values).growthRates().avg()); System.out.println(detrended + " " + Decimal.valueOf(detrended).growthRates().avg()); System.out.println(detrendedWithAbsolute + " " + Decimal.valueOf(detrendedWithAbsolute).growthRates().avg()); //CHECKSTYLE:ON } @Test public void testDetrendRelativePositive() { final List<Decimal> values = new ArrayList<Decimal>(); for (int i = 100; i >= 80; i--) { values.add(new Decimal(i)); } final List<Decimal> detrended = Decimal.valueOf(values).detrendRelative().values(); final List<Decimal> detrendedWithAbsolute = Decimal.valueOf(detrended).detrendAbsolute().values(); //CHECKSTYLE:OFF System.out.println(values + " " + Decimal.valueOf(values).growthRates().avg()); System.out.println(detrended + " " + Decimal.valueOf(detrended).growthRates().avg()); System.out.println(detrendedWithAbsolute + " " + Decimal.valueOf(detrendedWithAbsolute).growthRates().avg()); //CHECKSTYLE:ON } }