Sonntag, 10. Januar 2010

Abrunden Aufrunden

Betreff Abrunden/ Aufrunden?
Von Theo Beutekamp
Datum 06.11.2009 23:16:31

Ich hoffe, ich bin in der richtigen Newsgroup...
Ich möchte einen Code von C++ in Visual Basic 6 schreiben.
Ich habe diesen Code in C++:

dauer = unsigned(anteil+0.5);

"dauer" ist ein unsigned, da habe ich in Visual Basic 6 mit Long übersetzt.
"anteil" ist ein float, da habe ich Single genommen.

Nun ist "anteil" in C++ der Wert 111.23000.
Ich bin in beiden Sprachen noch nicht gut, deshalb verstehe ich nicht,
warum ich in C++ für "dauer" auf den Wert 111 komme und in Visual Basic
6 auf 112.

Ich habe folgende Übersetzung gewählt:

dauer = Clng(anteil + 0.5)

Sieht jemand den Unterschied und kann mir sagen, was ich anders machen
muss?

Betreff Re: Abrunden/ Aufrunden?
Von Gert Wietzorek
Datum 07.11.2009 08:48:21

Theo Beutekamp schrieb:
>
> dauer = unsigned(anteil+0.5);
>
>
> Ich habe folgende Übersetzung gewählt:
>
> dauer = Clng(anteil + 0.5)
>
> Sieht jemand den Unterschied und kann mir sagen, was ich anders machen
> muss?

CLNG rundet auf die nächste Ganzzahl. Nimm FIX(anteil + .5), das gibt
Dir nur den ganzzahligen Anteil.

Gruß
Gert


--

------------------------------------------------
| Antworten nur in die Newsgroup, |
| die E-Mail Adressen existieren nicht! |
| |
| answers and questions only to the newsgroup,|
| the email adresses are not valid |
| |
| http://www.gwsoftware.de |
------------------------------------------------

Betreff Re: Abrunden/ Aufrunden?
Von Theo Beutekamp
Datum 07.11.2009 09:23:05

Dankeschön für die hilfreiche Antwort!

Gert Wietzorek schrieb:
> Theo Beutekamp schrieb:
>> dauer = unsigned(anteil+0.5);
>>
>>
>> Ich habe folgende Übersetzung gewählt:
>>
>> dauer = Clng(anteil + 0.5)
>>
>> Sieht jemand den Unterschied und kann mir sagen, was ich anders machen
>> muss?
>
> CLNG rundet auf die nächste Ganzzahl. Nimm FIX(anteil + .5), das gibt
> Dir nur den ganzzahligen Anteil.
>
> Gruß
> Gert
>
>

Betreff Re: Abrunden/ Aufrunden?
Von "Peter Götz"
Datum 07.11.2009 10:34:52

Hallo Theo,

> Ich möchte einen Code von C++ in Visual Basic 6 schreiben.
> Ich habe diesen Code in C++:
>
> dauer = unsigned(anteil+0.5);
>
> "dauer" ist ein unsigned, da habe ich in Visual Basic 6 mit Long
> übersetzt.
> "anteil" ist ein float, da habe ich Single genommen.
>
> Nun ist "anteil" in C++ der Wert 111.23000.
> Ich bin in beiden Sprachen noch nicht gut, deshalb verstehe ich nicht,
> warum ich in C++ für "dauer" auf den Wert 111 komme und in Visual Basic 6
> auf 112.

VB rundet bei der Umwandlung eines Fliesskommawertes zu
Long nicht wie Du vermutlich erwartest nach kaufmännischer
Regel, sondern nach mathematisch-/statistischer.

So (mathematisch) rundet VB:

Debug.Print cLng(1.5) -> 2
Debug.Print cLng(2.5) -> 2
Debug.Print cLng(3.5) -> 4
Debug.Print cLng(4.5) -> 4

Es wird also immer zum nächsten geraden Wert hin
gerundet. Die selben Ergebnisse bekommst Du mit

Round(1.5, 0)
Round(2.5, 0)
... usw. ....

Schau Dir hierzu mal die Online-Hilfe zur Round-Funktion
an.

Du möchtest vermutlich kaufmännisch runden, also
nach unten bei x.1 bis x.4 und ab x.5 nach oben.

Kaufmännisch runden kannst Du so:

Public Function RoundMct _
(ByVal dblNumber As Double, _
ByVal intDecimals As Integer) As Double

' kaumfmännisches Runden auf intDecimals Stellen
Dim F As Variant
F = CDec(10 ^ intDecimals)
RoundMct = Int(CDec(dblNumber * F + 0.5)) / F
End Function

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)


Betreff Re: Abrunden/ Aufrunden?
Von Theo Beutekamp
Datum 07.11.2009 19:33:32

Danke, auch sehr hilfreich!

Peter Götz schrieb:
> Hallo Theo,
>
>> Ich möchte einen Code von C++ in Visual Basic 6 schreiben.
>> Ich habe diesen Code in C++:
>>
>> dauer = unsigned(anteil+0.5);
>>
>> "dauer" ist ein unsigned, da habe ich in Visual Basic 6 mit Long
>> übersetzt.
>> "anteil" ist ein float, da habe ich Single genommen.
>>
>> Nun ist "anteil" in C++ der Wert 111.23000.
>> Ich bin in beiden Sprachen noch nicht gut, deshalb verstehe ich nicht,
>> warum ich in C++ für "dauer" auf den Wert 111 komme und in Visual Basic 6
>> auf 112.
>
> VB rundet bei der Umwandlung eines Fliesskommawertes zu
> Long nicht wie Du vermutlich erwartest nach kaufmännischer
> Regel, sondern nach mathematisch-/statistischer.
>
> So (mathematisch) rundet VB:
>
> Debug.Print cLng(1.5) -> 2
> Debug.Print cLng(2.5) -> 2
> Debug.Print cLng(3.5) -> 4
> Debug.Print cLng(4.5) -> 4
>
> Es wird also immer zum nächsten geraden Wert hin
> gerundet. Die selben Ergebnisse bekommst Du mit
>
> Round(1.5, 0)
> Round(2.5, 0)
> ... usw. ....
>
> Schau Dir hierzu mal die Online-Hilfe zur Round-Funktion
> an.
>
> Du möchtest vermutlich kaufmännisch runden, also
> nach unten bei x.1 bis x.4 und ab x.5 nach oben.
>
> Kaufmännisch runden kannst Du so:
>
> Public Function RoundMct _
> (ByVal dblNumber As Double, _
> ByVal intDecimals As Integer) As Double
>
> ' kaumfmännisches Runden auf intDecimals Stellen
> Dim F As Variant
> F = CDec(10 ^ intDecimals)
> RoundMct = Int(CDec(dblNumber * F + 0.5)) / F
> End Function
>
> Gruß aus St.Georgen
> Peter Götz
> www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
>
>

Keine Kommentare:

Kommentar veröffentlichen