diff options
author | baltasarq <baltasarq@gmail.com> | 2021-07-05 17:17:54 +0200 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2021-07-07 21:59:24 +0200 |
commit | 70e86db58bd04d919b3f67efad6c94dc967fd900 (patch) | |
tree | b440fb951196a44c2692b15ec3648033913fd3fa /basic/source/runtime/methods1.cxx | |
parent | b2d93a34ce83e9442ba12c4f11586c9a02e63119 (diff) |
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 <mike.kaganski@collabora.com>
(cherry picked from commit 0eacbfa75132724faaeeb9ea22a1c3e44eefb515)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118493
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'basic/source/runtime/methods1.cxx')
-rw-r--r-- | basic/source/runtime/methods1.cxx | 23 |
1 files changed, 2 insertions, 21 deletions
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); } |