[Libreoffice-commits] core.git: basic/qa basic/source

baltasarq (via logerrit) logerrit at kemper.freedesktop.org
Tue Jul 6 12:50:44 UTC 2021


 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 <baltasarq at gmail.com>
AuthorDate: Mon Jul 5 17:17:54 2021 +0200
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
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 <mike.kaganski at collabora.com>

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);
 }


More information about the Libreoffice-commits mailing list