1

ich mit der ROUND-Funktion in Basic für Libreoffice in ein Problem ausgeführt haben:Round Funktion Forces Scientific Notation statt Dezimal

Function Round(dNumber As Double, iDecimals As Integer) As Variant 
    Dim oRound As Object 
    Dim vArgs(1 to 2) As Variant 

    oRound = createUnoService("com.sun.star.sheet.FunctionAccess") 

    vArgs(1) = dNumber 
    vArgs(2) = iDecimals 

    Round = oRound.callFunction("round", vArgs()) 
End Function 

Es gibt wissenschaftliche Schreibweise auf dNumber Werte, die weniger als 0,1 statt der abgerundeten Dezimalwert, der erwartet wird.

Beispiel: msgbox (Round (0,0333333, 2))

Ergebnisse in: 3E-02.00 statt der erwarteten: 0,03

Kann mir jemand sagen, warum diese auftreten, und wenn Die Lösung, die ich unten geschrieben habe, ist der richtige Weg, um das Problem zu umgehen, oder ob es einen besseren Weg gibt?

Function Round(dNumber As Double, iDecimals As Integer) As Variant 
    Dim oRound As Object 'Round function object 
    Dim dCompNumber As Double 'Store the Compensated value of dNumber 
    Dim dResult As Double 'Result of the rounding to be passed 
    Dim vArgs(1 to 2) As Variant 'Arguments: Number to be rounded, Number of decimal places 

    dCompNumber = dNumber 'Copy dNumber 

    oRound = createUnoService("com.sun.star.sheet.FunctionAccess") 
    'Get access to the library that contains the Round() function 

    'Compensate for Scientific Notation that occurs with numbers less than 0.1 
    If dNumber < 0.1 Then dCompNumber = dNumber + 1 ' Add 1 to temporarily increase value > 0.1 

    vArgs(1) = dCompNumber 
    vArgs(2) = iDecimals 

    dResult = oRound.callFunction("round", vArgs()) 

    'Remove the Compensation for Scientific Notation 
    If dNumber < 0.1 Then dResult = dResult - 1 'Subtract 1 from the temporary value so that it is back to < 0.1 

    Round = dResult 
End Function 

Screenshot of simplified Round() function using Msgbox() to output the result of 3E-02 in Scientific Notation instead of the expected result of 0.03 in decimal.

+0

'Round' ist kein guter Name für Ihre Funktion, denn das ist die gleiche wie die eingebaute Funktion. –

Antwort

0

Der bevorzugte Weg in Libreoffice Basic runden bei https://forum.openoffice.org/en/forum/viewtopic.php?f=13&t=66808 beschrieben.

Function MyRound(dNumber As Double, iDecimals As Integer) As Double 
    MyRound = Int(dNumber * 10^iDecimals + 0.5)/10^iDecimals 
End Function 

Eingabe =MYROUND(1/3,5) in der Tabelle erzeugt 0.33333.

Verwandte Themen