From e3ea169f265df3a5bd8bf0b8f4d9b1f7138e2bbc Mon Sep 17 00:00:00 2001 From: Jia Ke Date: Wed, 28 Jun 2023 10:41:48 +0000 Subject: [PATCH] revert Fix half up in round --- velox/expression/tests/ExprTest.cpp | 8 ++++++++ velox/functions/prestosql/ArithmeticImpl.h | 9 ++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/velox/expression/tests/ExprTest.cpp b/velox/expression/tests/ExprTest.cpp index d9c21e5add3f..62cd0a213af7 100644 --- a/velox/expression/tests/ExprTest.cpp +++ b/velox/expression/tests/ExprTest.cpp @@ -839,6 +839,14 @@ TEST_F(ExprTest, shortCircuit) { assertEqualVectors(expectedResult, result); } +TEST_F(ExprTest, round) { + vector_size_t size = 4; + auto a = makeConstant(-1.0249999999999999, size); + auto result = evaluate("round(c0, cast (3 as int))", makeRowVector({a})); + auto expectedResult = makeConstant(-1.025, size); + assertEqualVectors(expectedResult, result); +} + // Test common sub-expression (CSE) optimization with encodings. // CSE evaluation may happen in different contexts, e.g. original input rows // on first evaluation and base vectors uncovered through peeling of encodings diff --git a/velox/functions/prestosql/ArithmeticImpl.h b/velox/functions/prestosql/ArithmeticImpl.h index 241d1dae2d53..9b4d1ae16969 100644 --- a/velox/functions/prestosql/ArithmeticImpl.h +++ b/velox/functions/prestosql/ArithmeticImpl.h @@ -44,15 +44,10 @@ round(const TNum& number, const TDecimals& decimals = 0) { } double factor = std::pow(10, decimals); - double variance = 0.1; if (number < 0) { - return (std::round( - std::nextafter(number, number - variance) * factor * -1) / - factor) * - -1; + return (std::round(number * factor * -1) / factor) * -1; } - return std::round(std::nextafter(number, number + variance) * factor) / - factor; + return std::round(number * factor) / factor; } // This is used by Velox for floating points plus.