package io.bitsquare.common.util; import com.google.common.math.DoubleMath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigDecimal; import java.math.RoundingMode; public class MathUtils { private static final Logger log = LoggerFactory.getLogger(MathUtils.class); public static double roundDouble(double value, int precision) { return roundDouble(value, precision, RoundingMode.HALF_UP); } public static double roundDouble(double value, int precision, RoundingMode roundingMode) { if (precision < 0) throw new IllegalArgumentException(); try { BigDecimal bd = BigDecimal.valueOf(value); bd = bd.setScale(precision, roundingMode); return bd.doubleValue(); } catch (Throwable t) { log.error(t.toString()); return 0; } } public static long roundDoubleToLong(double value) { return roundDoubleToLong(value, RoundingMode.HALF_UP); } public static long roundDoubleToLong(double value, RoundingMode roundingMode) { return DoubleMath.roundToLong(value, roundingMode); } public static int roundDoubleToInt(double value) { return roundDoubleToInt(value, RoundingMode.HALF_UP); } public static int roundDoubleToInt(double value, RoundingMode roundingMode) { return DoubleMath.roundToInt(value, roundingMode); } public static long doubleToLong(double value) { return new Double(value).longValue(); } public static double scaleUpByPowerOf10(double value, int exponent) { double factor = Math.pow(10, exponent); return value * factor; } public static double scaleUpByPowerOf10(long value, int exponent) { double factor = Math.pow(10, exponent); return ((double) value) * factor; } public static double scaleDownByPowerOf10(double value, int exponent) { double factor = Math.pow(10, exponent); return value / factor; } public static double scaleDownByPowerOf10(long value, int exponent) { double factor = Math.pow(10, exponent); return ((double) value) / factor; } public static double exactMultiply(double value1, double value2) { return BigDecimal.valueOf(value1).multiply(BigDecimal.valueOf(value2)).doubleValue(); } }