For safety, make optimized round method consistent with Math.round for negative input too

This commit is contained in:
Sean Owen 2014-04-23 22:18:54 +01:00
parent 27b5ce245d
commit 3b8b44856d
2 changed files with 53 additions and 2 deletions

View file

@ -23,13 +23,15 @@ public final class MathUtils {
/**
* Ends up being a bit faster than {@link Math#round(float)}. This merely rounds its
* argument to the nearest int, where x.5 rounds up to x+1.
* argument to the nearest int, where x.5 rounds up to x+1. Semantics of this shortcut
* differ slightly from {@link Math#round(float)} in that half rounds down for negative
* values. -2.5 rounds to -3, not -2. For purposes here it makes no difference.
*
* @param d real value to round
* @return nearest {@code int}
*/
public static int round(float d) {
return (int) (d + 0.5f);
return (int) (d + (d < 0.0f ? -0.5f : 0.5f));
}
public static float distance(float aX, float aY, float bX, float bY) {

View file

@ -0,0 +1,49 @@
/*
* Copyright 2014 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.common.detector;
import org.junit.Assert;
import org.junit.Test;
public final class MathUtilsTestCase extends Assert {
@Test
public void testRound() {
assertEquals(-1, MathUtils.round(-1.0f));
assertEquals(0, MathUtils.round(0.0f));
assertEquals(1, MathUtils.round(1.0f));
assertEquals(2, MathUtils.round(1.9f));
assertEquals(2, MathUtils.round(2.1f));
assertEquals(3, MathUtils.round(2.5f));
assertEquals(-2, MathUtils.round(-1.9f));
assertEquals(-2, MathUtils.round(-2.1f));
assertEquals(-3, MathUtils.round(-2.5f)); // This differs from Math.round()
assertEquals(Integer.MAX_VALUE, MathUtils.round(Integer.MAX_VALUE));
assertEquals(Integer.MIN_VALUE, MathUtils.round(Integer.MIN_VALUE));
assertEquals(Integer.MAX_VALUE, MathUtils.round(Float.POSITIVE_INFINITY));
assertEquals(Integer.MIN_VALUE, MathUtils.round(Float.NEGATIVE_INFINITY));
assertEquals(0, MathUtils.round(Float.NaN));
}
}