Gleitkommazahlen werden im Binary Floating Point Format abgelegt und aufgrund ihrer endlichen Genauigkeit entstehen beim Zurückrechnen Ungenauigkeiten. Schreibt man das Quiz ein wenig um, so wird dies ersichtlich:
static void Main(string[] args) { double d1 = 1.000001F; double d2 = 0.000001F; Console.WriteLine(d1); Console.WriteLine(d2); Console.WriteLine((d1 - d2) == 1.0); Console.ReadLine(); }
Eine Alternative mit einer Präzision von 96 Bit, wäre decimal. Dies ist für Finanzmathematische Themen gedacht und minimiert Rundungsfehler (bei Addition und Subtraktion treten keine Ungenauigkeiten auf).
static void Main(string[] args) { decimal d1 = 1.000001M; decimal d2 = 0.000001M; Console.WriteLine(d1); Console.WriteLine(d2); Console.WriteLine((d1 - d2) == 1.0M); Console.ReadLine(); }
Die Thematik in allen Details gibt es u.a. hier zum Nachschlagen:
- http://www.mycsharp.de/wbb2/thread.php?threadid=64462
- http://www.mycsharp.de/wbb2/thread.php?threadid=98035
- http://msdn.microsoft.com/de-de/library/bb978923.aspx
Binary Floating Point
http://kipirvine.com/asm/workbook/floating_tut.htm