/* * ************************************************************************************* * Copyright (C) 2008 EsperTech, Inc. All rights reserved. * * http://esper.codehaus.org * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * * ************************************************************************************* */ package com.espertech.esper.support.util; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; /** * Utility class for comparing double values up to a given precision */ public class DoubleValueAssertionUtil { public static boolean equals(double valueActual, double valueExpected, int precision) { if (precision < 1) { throw new IllegalArgumentException("Invalid precision value of " + precision + " supplied"); } if ((Double.valueOf(valueActual).isNaN()) && (Double.valueOf(valueExpected).isNaN())) { return true; } if ( ((Double.valueOf(valueActual).isNaN()) && (!Double.valueOf(valueExpected).isNaN())) || ((!Double.valueOf(valueActual).isNaN()) && (Double.valueOf(valueExpected).isNaN())) ) { log.debug(".equals Compare failed, " + " valueActual=" + valueActual + " valueExpected=" + valueExpected); return false; } double factor = Math.pow(10, precision); double val1 = valueActual * factor; double val2 = valueExpected * factor; // Round to closest integer double d1 = Math.rint(val1); double d2 = Math.rint(val2); if (d1 != d2) { log.debug(".equals Compare failed, " + " valueActual=" + valueActual + " valueExpected=" + valueExpected + " precision=" + precision ); return false; } return true; } private static final Log log = LogFactory.getLog(DoubleValueAssertionUtil.class); }