diff --git a/src/runtime.cc b/src/runtime.cc index 48147b7d0f..8af4e33ff3 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -4662,7 +4662,9 @@ static Object* Runtime_Math_round(Arguments args) { CONVERT_DOUBLE_CHECKED(x, args[0]); if (signbit(x) && x >= -0.5) return Heap::minus_zero_value(); - return Heap::NumberFromDouble(floor(x + 0.5)); + double integer = ceil(x); + if (integer - x > 0.5) { integer -= 1.0; } + return Heap::NumberFromDouble(integer); } diff --git a/test/mjsunit/math-round.js b/test/mjsunit/math-round.js new file mode 100644 index 0000000000..d80a1036fb --- /dev/null +++ b/test/mjsunit/math-round.js @@ -0,0 +1,52 @@ +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +assertEquals(0, Math.round(0)); +assertEquals(-0, Math.round(-0)); +assertEquals(Infinity, Math.round(Infinity)); +assertEquals(-Infinity, Math.round(-Infinity)); +assertNaN(Math.round(NaN)); + +assertEquals(1, Math.round(0.5)); +assertEquals(1, Math.round(0.7)); +assertEquals(1, Math.round(1)); +assertEquals(1, Math.round(1.1)); +assertEquals(1, Math.round(1.49999)); +assertEquals(1/-0, 1/Math.round(-0.5)); // Test for -0 result. +assertEquals(-1, Math.round(-0.5000000000000001)); +assertEquals(-1, Math.round(-0.7)); +assertEquals(-1, Math.round(-1)); +assertEquals(-1, Math.round(-1.1)); +assertEquals(-1, Math.round(-1.49999)); +assertEquals(-1, Math.round(-1.5)); + +assertEquals(9007199254740990, Math.round(9007199254740990)); +assertEquals(9007199254740991, Math.round(9007199254740991)); +assertEquals(-9007199254740990, Math.round(-9007199254740990)); +assertEquals(-9007199254740991, Math.round(-9007199254740991)); +assertEquals(Number.MAX_VALUE, Math.round(Number.MAX_VALUE)); +assertEquals(-Number.MAX_VALUE, Math.round(-Number.MAX_VALUE));