| 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)
>
>
No comments:
Post a Comment