summaryrefslogtreecommitdiff
path: root/basic/source/runtime/methods1.cxx
diff options
context:
space:
mode:
authorbaltasarq <baltasarq@gmail.com>2021-07-05 17:17:54 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2021-07-07 21:59:24 +0200
commit70e86db58bd04d919b3f67efad6c94dc967fd900 (patch)
treeb440fb951196a44c2692b15ec3648033913fd3fa /basic/source/runtime/methods1.cxx
parentb2d93a34ce83e9442ba12c4f11586c9a02e63119 (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.cxx23
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);
}