[New] added MathHelper for precision assertions

This commit is contained in:
Robert von Burg 2013-10-24 21:43:06 +02:00
parent f176960ba9
commit 5df4b9edc1
1 changed files with 121 additions and 0 deletions

View File

@ -0,0 +1,121 @@
/*
* Created on 05.01.2004
*/
/*
* Copyright (c) 2006 - 2011 Apixxo AG Hauptgasse 25 4600
* Olten
*
* All rights reserved.
*
*/
package ch.eitchnet.utils.helper;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
* A helper class that contains mathematical computations that can be used throughout.
*
* @author msmock, gattom
*/
public class MathHelper {
public static final double PRECISION = 1.0E08;
public static final int PRECISION_DIGITS = 3;
/**
* Check if the two values are equal with respect to the precision
*
* @param firstValue
* the first value to compare
* @param secondValue
* the second value to compare to
* @return boolean True, if the two values are equal under the set precision. Fales, otherwise.
*/
public static boolean isEqualPrecision(double firstValue, double secondValue) {
return (java.lang.Math.abs(firstValue - secondValue) < (1.0d / PRECISION));
}
/**
* Comparison between the two values. Given the precision, this function determines if the given value is smaller
* than the given bound.
* <p>
* Note: this implementation tests if the value < bound, and if this is not so, checks if the values are equal under
* the precision. Thus, it's efficient whenever the value is expected to be smaller than the bound.
*
* @param value
* The value to check
* @param bound
* The bound given
* @return true, if value < bound under the given precision. False, otherwise.
*/
public static boolean isSmallerEqualPrecision(double value, double bound) {
if (value < bound)
return true;
return isEqualPrecision(value, bound);
}
/**
* Comparison between two values. Given the precision, this function determines if the given value is greater than
* the given bound.
* <p>
* Note: This implementation tests if value > bound and, if it is so, if equality does NOT hold. Thus, it is
* efficient whenever the value is not expected to be greater than the bound.
*
* @param value
* The value to check
* @param bound
* The bound given.
* @return true, if value > bound and the values do not test equal under precision. False, otherwise.
*/
public static boolean isGreaterPrecision(double value, double bound) {
return (value > bound) && !isEqualPrecision(value, bound);
}
/**
* <p>
* Rounds the given double value to the number of decimals
* </p>
*
* <p>
* <b>Warning:</b> Do not use the returned value for further calculations. Always finish calculates and use one of
* the following methods:
* <ul>
* <li>{@link #isEqualPrecision(double, double)},</li>
* <li>{@link #isGreaterPrecision(double, double)} or</li>
* <li>{@link #isSmallerEqualPrecision(double, double)}</li>
* </ul>
* to test on equality or greater than/ smaller than
* </p>
*
* @param value
* the double value to round
* @param decimals
* number of decimals
*
* @return the rounded number
*/
public static double toPrecision(double value, int decimals) {
if (value == 0.0)
return 0.0;
if (Double.isNaN(value))
return Double.NaN;
if (value == Double.NEGATIVE_INFINITY)
return Double.NEGATIVE_INFINITY;
if (value == Double.POSITIVE_INFINITY)
return Double.POSITIVE_INFINITY;
return new BigDecimal(value).setScale(decimals, RoundingMode.HALF_EVEN).doubleValue();
}
/**
* Returns the value with the precision where precision is set to {@link #PRECISION_DIGITS}
*
* @see #toPrecision(double, int)
*/
public static double toPrecision(double value) {
return toPrecision(value, PRECISION_DIGITS);
}
}