2010-02-11 8 views
6

Kann jemand beleuchten, warum kann ich sehr klein zu sehen (10^-08) Zahl Unterschiede, wann genau die gleichen Zahlen in Excel vs C# ??Excel Vs C# Anzahl Unterschiede

Ich habe eine Formel und verwenden die gleichen Eingaben. In Excel bekomme ich eine Nummer - In C# bekomme ich noch eine. Der Unterschied ist winzig.

Ich bin mit Doppel in C# und Teilung zu tun. Ich habe mit Dezimalzahlen versucht, die nicht

EDIT viel Unterschied gemacht hat: Das treibt mich NUTS - ich den ganzen Vormittag dafür ausgegeben ahve - Irgendwelche Ideen ??

+0

ich denke, eine ähnliche Frage wurde zuvor gestellt ... –

+0

Irgendeine Idee wo ?? –

Antwort

2

Der Unterschied ist wegen der unterschiedlichen MidPoint Rundungsregeln in C# und Excel.

Math.Round(someNumber,precision,MidpointRounding.AwayFromZero); Versuchen

2

Mit solchen kleinen Größen der Differenz (10^-08, Sie angeben), ich vermute, dass Zwischenberechnungen das Problem verursachen. Beachten Sie, dass Werte mit doppelter Genauigkeit 64 Bit sind, die Register jedoch mit 80 Bit Genauigkeit arbeiten können. Wenn Sie also eine Codefolge haben, bei der der Compiler alle Ihre Zwischenberechnungen in den Registern behält, erhalten Sie tatsächlich eine bessere Genauigkeit, als wenn dieselben Berechnungen an verschiedenen Punkten in Ihrem Code vorgenommen werden, so dass die Zwischenergebnisse in 64 gehalten werden müssen Bitspeicherorte.

Wenn Sie Werte speichern in Excel-Zellen als Teil Ihrer Berechnungen, dies wird auch zur Folge haben Ihre Zwischenberechnungen zu 64 Bit Genauigkeit in Kürzen.

Sie müssen Ihren Code wirklich zeigen: Zeigen Sie beide (a) die Excel-Berechnungen (ist es eine Arbeitsblattformel oder machen Sie programmatische Zuweisungen zu den Zellenwerten?) Und (b) die C# -Berechnungen, die Sie vornehmen. Wenn Sie das tun, sollten wir Ihnen genauer helfen können. Aber mit den Informationen, die Sie bisher gegeben haben, können wir nur grobe Vermutungen anstellen.

- Mike

0

Dieses Thema hat mich auch vorher verrückt =).

Vor ein paar Jahren entdeckte ich, dass Excel-Arbeitsblatt =ROUND() Funktion verschiedene Ergebnisse als VBA ROUND() Funktion produziert. Ich entdeckte auch, dass VBA und MySQL Version 4.x (ich kann mich nicht an die genaue Version erinnern; vor 5.x) den genau gleichen Algorithmus zum Runden von Fließkommazahlen verwendet. Sie schienen eine fehlerhafte Version von "Banker's Rundung" zu verwenden. In späteren Versionen änderte MySQL ihre Rundung, aber jemand wies darauf hin, dass die Ähnlichkeit zwischen der Implementierung von VBA und MySQL 4.x ROUND wahrscheinlich darauf zurückzuführen sei, dass beide auf die Programmiersprache C (wahrscheinlich zur Erstellung von VBA und MySQL) implementiert Runde.

Sowohl VBA und MySQL 4.x einfach implementiert, welche C verwendet Runden zu implementieren. Viele moderne Programmiersprachen haben jedoch aus verschiedenen Gründen ihre eigenen Rundungsmethoden gewählt; Manchmal stimmt es mit der IEEE-Spezifikation überein und manchmal entspricht es dem, was die Benutzer erwarten. Im Falle von VBA und MySQL 4.x wurde vom Benutzer nie eine fehlerhafte Version der Banker-Rundung erwartet (daher Ihre Frustration), so dass zukünftige Sprachen neue Versionen von Rundungs-oder bereitgestellten Alternativen (wie zum Beispiel decimal in C#) implementieren dass der Benutzer in der Lage wäre, erwartete Werte zu produzieren und mehr Kontrolle über den gesamten Prozess zu haben.

Sie könnte versuchen, in diesem Artikel für die weitere Aufklärung über das Thema in Bezug auf VBA Rundung suchen: http://www.vb-helper.com/howto_round_to_specified_digits.html

0

Sind Sie sicher, dass Sie die gesamte Nummer in Excel sehen?

Zahlen, die als "Allgemein" formatiert sind, werden mit ~ 12 Stellen der Genauigkeit angezeigt (oder weniger, wenn die Spalte nicht breit genug für ~ 12 Ziffern ist). Wenn Sie beispielsweise die Formel "= PI()" in eine Zelle mit dem Format "Allgemein" (die Standardeinstellung in Excel) eingeben und die Spalte breit genug formatieren, wird 3.141592654 angezeigt. Wenn die Spalte nicht breit genug ist, sehen Sie noch weniger Genauigkeitsziffern.

Jetzt formatieren Sie diese Zelle mit dem benutzerdefinierten Zahlenformat "0.00000000000000000" und Sie werden 3.14159265358979000 sehen (wenn die Spalte breit genug ist).

Beachten Sie, dass Excel intern den Wert von = PI() intern mit mehr als 15 Stellen der Genauigkeit speichert. Sie können dies sehen, indem Sie "= (PI() - 3.14159265358979)" in eine Zelle eingeben - achten Sie darauf, die Klammer in die Formel aufzunehmen.

Jetzt geben Sie einfach "= PI() - 3.14159265358979" in eine Zelle ein und Sie werden sehen, dass Sie Null erhalten. In einigen Fällen, wie z. B. Addieren oder Subtrahieren, bei denen das Ergebnis "fast Null" ist, konvertiert Excel das Ergebnis tatsächlich in 0.0 (das kann Sie verrückt machen, wenn Sie nicht wissen, dass es passiert).

Verwandte Themen