basic/qa/vba_tests/roundcompatibility.vb | 29 +++++++++++++++++++++++++++++ basic/source/runtime/methods1.cxx | 23 ++--------------------- 2 files changed, 31 insertions(+), 21 deletions(-)
New commits: commit 0eacbfa75132724faaeeb9ea22a1c3e44eefb515 Author: baltasarq <[email protected]> AuthorDate: Mon Jul 5 17:17:54 2021 +0200 Commit: Mike Kaganski <[email protected]> CommitDate: Tue Jul 6 14:50:09 2021 +0200 tdf#142922 fixes Round to follow half-to-even rounding The LibreOffice's Basic Round function does not return values that are compatible with VBA's Round. This can be easily fixed using rtl/round, which has a flag parameter called rtl_math_RoundingMode_HalfEven which rounds real numbers exactly in the expected way. Change-Id: I2215f08427e5777fc2d35f054b635dfa6247af8c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118444 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> diff --git a/basic/qa/vba_tests/roundcompatibility.vb b/basic/qa/vba_tests/roundcompatibility.vb new file mode 100644 index 000000000000..aaa078925d3b --- /dev/null +++ b/basic/qa/vba_tests/roundcompatibility.vb @@ -0,0 +1,29 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +Option VBASupport 1 +Option Explicit + +Function doUnitTest() As String + TestUtil.TestInit + verify_roundCompatibility + doUnitTest = TestUtil.GetResult() +End Function + +Sub verify_roundCompatibility() + On Error GoTo errorHandler + + TestUtil.AssertEqual(Round(0.12335,4), 0.1234, "Round(0.12335,4)") + TestUtil.AssertEqual(Round(0.12345,4), 0.1234, "Round(0.12345,4)") + TestUtil.AssertEqual(Round(0.12355,4), 0.1236, "Round(0.12355,4)") + TestUtil.AssertEqual(Round(0.12365,4), 0.1236, "Round(0.12365,4)") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_roundCompatibility", Err, Error$, Erl) +End Sub diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx index 9addf7140adf..b20b3fce3775 100644 --- a/basic/source/runtime/methods1.cxx +++ b/basic/source/runtime/methods1.cxx @@ -51,6 +51,7 @@ #include <propacc.hxx> #include <sal/log.hxx> #include <eventatt.hxx> +#include <rtl/math.h> #include <comphelper/processfactory.hxx> #include <comphelper/string.hxx> @@ -2388,13 +2389,6 @@ void SbRtl_Round(StarBASIC *, SbxArray & rPar, bool) double dRes = 0.0; if( dVal != 0.0 ) { - bool bNeg = false; - if( dVal < 0.0 ) - { - bNeg = true; - dVal = -dVal; - } - sal_Int16 numdecimalplaces = 0; if( nParCount == 3 ) { @@ -2406,20 +2400,7 @@ void SbRtl_Round(StarBASIC *, SbxArray & rPar, bool) } } - if( numdecimalplaces == 0 ) - { - dRes = floor( dVal + 0.5 ); - } - else - { - double dFactor = pow( 10.0, numdecimalplaces ); - dVal *= dFactor; - dRes = floor( dVal + 0.5 ); - dRes /= dFactor; - } - - if( bNeg ) - dRes = -dRes; + dRes = rtl_math_round(dVal, numdecimalplaces, rtl_math_RoundingMode_HalfEven); } rPar.Get(0)->PutDouble(dRes); } _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
