Frage

Kann jemand erklären, diese Seltsamkeit:

Dim result as single = 0
result = CType("8.01", Single) * 100 ' result=801.0 as expected
result = CType("8.02", Single) * 100 ' result=802.000061 --- not expected

Im Anschluss an den oben

result = 8.02 * 100 ' result = 802.0 as expected
War es hilfreich?

Lösung

Single (oder float) nur sieben signifikante Stellen, so alles, was über diejenigen gedruckt werden könnte ohnehin ziemlich unecht ist. Dies ist ein normaler Artefakt der Gleitkommaarithmetik. Sie können nur auf 4 Stellen nach dem Komma mit Ihrer Nummer verlassen sich auf bis (als drei signifikante Stellen bereits vor dem Komma sind).

weiter ausgearbeitet, die Zahlen 8,01 und 8,02 nicht exakt binären Speichers Verwendung dargestellt werden (wie weder noch 0,01 0,02 mit Summen von Fraktionen der Form 1/2 exakt dargestellt werden n ). Die Details von Nummer zu Nummer kann variieren, aber sie können sehen Fremd Stellen außerhalb der normalen Präzisionsbereich, wenn solche Zahlen.

Dies wirkt sich nicht auf die Tatsache, dass 801 und 802 kann genau dargestellt werden, aber Sie haben keine genaue Zahl mit in diesem Fall zu starten.

ETA: In der Tat, was Sie sehen, wenn Sie die Berechnung direkt enthalten ist gerade dies: Der Compiler wird die Berechnung für Sie und einfach schreiben 802 in das Programm bewerten. Sie können Reflector, dass überprüfen verwenden. Auch Floating-Point-Literale im Quellcode ist wahrscheinlich Double standardmäßig, so dass Sie viel mehr Präzision haben mit hier zu beginnen. Wenn result ein Single ist, wird dies nach dem Komma zu Single und der Fehler in der 16. Ziffer downcasted wird einfach weggeworfen, da sie nicht in Single passen sowieso.

Andere Tipps

Dies ist aufgrund einer Einschränkung in der Art und Weise Gleitkommazahlen in Speicher dargestellt ist. Haben Sie einen Lese durch die Wikipedia-Seite für die volle lowdown - es ist kein Fehler, oder etwas Bestimmtes zu .net.

EDIT:. Diese beiden Artikel sind einen Blick wert zu (letzteres ist Mathe schwer)

Wenn das, was Sie brauchen ist Gleitkomma-Werte zu vergleichen, finden Sie hier: Vergleich Gleitkomma Werte

Single und Double in NET als Gleitkommazahlen dargestellt und leider sind diese Arten von Zahlen speichert, ist nicht präzise. Sie werden kleine Abweichungen erhalten, wenn sie mit ‚Single‘ und ‚Double‘ Zahlen zu arbeiten.

Allerdings gibt es eine Alternative - .NET hat eine Decimal Art, die mit diesen Zahlen zu tun haben viel besser ist. Es ist perfekt, noch nicht (siehe http://www.yoda.arachsys.com/csharp/ decimal.html - insbesondere den letzten Absatz), sondern wird wie Geld repräsentieren Mengen viel besser sein

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top