Anzeige
Archiv - Navigation
1028to1032
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Runden/Datentypen

Runden/Datentypen
09.12.2008 18:02:56
Larass
Hallo,
bei Google ist ja zum Thema runden jede Menge zu finden. Leider habe ich mein Problem damit nicht gelöst.
Ich möchte eine Auflagegerkraft bestimmen und diese auf zwei Stellen gerundet in eine Excel-Zelle schreiben.
Hier mein code dazu:

Sub Auflagerkraft()
Dim A As Single, l As Single, F As Single, LagerA As Single, Lager As Single, Kraft As  _
Single
Dim Zielfeld As String
A = CSng(InputBox("Abstand der Kraft F zum Auflager:", "Abstand a", "Dezimalzahl"))
l = CSng(InputBox("Länge des Balkens:", " Länge l", "Dezimalzahl"))
F = CSng(InputBox("Betrag der Kraft F:", "Kraft F", "Dezimalzahl"))
Zielfeld = InputBox("In welche Zelle soll der Wert geschrieben werden:", "Zielzelle", "Zelle" _
)
Lager = Auf(A, l, F)
Kraft = Application.WorksheetFunction.Round(Lager, 2)
ActiveSheet.Range(Zielfeld).Value = Kraft
End Sub



Function Auf(A As Single, l As Single, F As Single) As Single
Auf = F * (1 - A / l)
End Function


Ich habe es sowohl mit der Excelfunktion (s.o.) als auch mit vorangestellter round-Funktion:


Function Round(ByVal Number As Double, ByVal digits As Integer) As Double
Round = Int(Number * 10 ^ digits + 0.5) / 10 ^ digits
End Function


versucht.
In der Zelle landet in beiden Fällen: 1.39999997615814 (bei a=0,3, l=1, F=2)
Kann mir bitte jemand sagen wo das Problem liegt?

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Runden/Datentypen
09.12.2008 19:35:00
Erich
Hallo Vorname(?),
zwei Möglichkeiten:
1.
Ersetze überall "Single" durch "Double". Das kostet nicht viel.
und/oder 2.
Wenn du die Variable "Kraft" nicht woanders noch brauchst, lasse sie einfach weg und schreibe
ActiveSheet.Range(Zielfeld).Value = Application.WorksheetFunction.Round(Lager, 2)
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
AW: Runden/Datentypen
09.12.2008 19:58:00
Larass
Hallo Erich,
jetzt geht es! Keine Ahnung warum, aber das hatte ich vorhin auch schon.
Die Variable Lager wird auch nicht unbedingt benötigt:
ActiveSheet.Range(Zielfeld).Value = Application.WorksheetFunction.Round(Auf(A, l, F), 2)
tut's auch - trotzdem Danke!
Kannst Du mir trotzdem noch sagen warum double statt single? Wenn ich doch das Ergebniss nur auf zwei Stellen genau brauche und keine Kräfte größer 1E5 zu erwarten sind...
Ich lasse den post daher noch mal offen.
Viele Grüße,
Lars aus Lübeck
Anzeige
AW: Runden/Datentypen
09.12.2008 20:32:26
Erich
Hi Lars,
bei Single-Variablen speichert und rechnet VBA nur mit 7 siginifikanten Stellen,
bei Double sind das 15 Stellen.
Damit ist klar, dass Single-Berechnungen sehr viel ungenauer sind als Berechnungen mit Double.
Die "Stellen" sind hier nicht nur die Nachkommastellen, sondern auch die Vorkommastellen.
Gib mal in einer Excelzelle eine ganze Zahl mit 20 Ziffern ein - alle ungleich 0.
Dann wirst du sehen, dass Excel die letzten Stellen auf 0 setzt.
Hier noch ein paar Links zum Stöbern und Nachlesen:
https://www.herber.de/forum/archiv/456to460/t456667.htm
https://www.herber.de/forum/archiv/124to128/t127797.htm
http://www.aboutwebdesign.de/awd/content/1014916256.shtml
http://support.microsoft.com/?scid=kb;en-us;165373
http://msdn.microsoft.com/de-de/library/ae55hdtk(VS.80).aspx
http://msdn.microsoft.com/de-de/library/bt913yt6(VS.80).aspx
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
Datentypen
10.12.2008 13:12:55
Larass
Vielen Dank, kann mir trotzdem nicht erklären, warum erst eine ungenaue Zahl herauskam, obwohl ich das gleiche hatte! Dazu müsste man die BCD-Berechnungen wohl genauer studieren...
Auch dieses Beispiel aus dem einen post:

Sub test()
Dim Wert As Single
Wert = 0.18
Cells(1, 1) = Wert
End Sub


finde ich echt mal krass. Die Erklärung, dass beim Rechnen mit Gleitkomma-Zahlen Ungenauigkeiten auftreten habe ich verstanden und kann es nachvollziehen. http://mandalex.manderby.com/b/bcd.php
Kann mir jemand aber einfach erklären wieso das Beispiel oben einen reproduzierbaren Fehler liefert?
Es kann doch nicht sooooo schwer sein 0.18 zu speichern und wiederzugeben (sagt der ingenieursdenkende Informatiklaie)
Gruß, Lars

Anzeige
AW: Datentypen
10.12.2008 13:42:19
Erich
Hi Lars,
probier das mal aus:

Sub test()
Dim sngW As Single, dblW As Double
Cells(1, 1).Resize(2).NumberFormat = "0.000000000000000000"
sngW = 0.18:      Cells(1, 1) = sngW
dblW = 0.18:      Cells(2, 1) = dblW
End Sub

Dabei entsteht das hier:

 AB
10,180000007152557000  bis zur 8. Stelle ist der Wert ok, dann wirds falsch
20,180000000000000000  Wert ist ok

In A1 wurde der Single-Wert geschrieben - von dem stimmen die ersten 8 signifikanten Stellen.
Single ist eben nicht so genau.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige