Was ist der beste Weg, Doppel- und Int zu vergleichen?
Frage
Der folgende Code in C # nicht funktioniert:
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
Also, die Frage: Was ist der beste Weg, Doppel und Int vergleichen
Lösung
Sie können wirklich nicht vergleichen Punkt und Integralwerte in einer naiven Art und Weise schwimmend; vor allem, da es die klassisch Gleitkomma Darstellung Herausforderungen . Was Sie können tun subtrahieren ist eine von der anderen und sehen, ob der Unterschied zwischen ihnen ist kleiner als eine Präzision, die Sie interessieren, etwa so:
int iValue = 0;
double dValue = 0.0;
var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
return true; // items equal
Sie haben wirklich für sich selbst definieren, welche equality
für Sie bedeutet. Zum Beispiel können Sie einen Gleitkommawert wollen auf die nächste ganze Zahl runden, so dass 3,999999981 sein wird „gleich“ bis 4. Oder Sie können den Wert abschneiden wollen, so wäre es effektiv 3. Alles, was Sie hängt ist zu erreichen versuchen.
EDIT: Beachten Sie, dass i 0.0000001 als Beispiel Schwellenwert gewählt ... müssen Sie für sich selbst entscheiden, welche Präzision für den Vergleich ausreichend ist. Nur merkt man, innerhalb der normalen Darstellungs Grenzen double
sein müssen, die ich glaube, als Double.Epsilon
definiert.
Andere Tipps
Es ist eine überaus schlechte Idee zu vergleichen ganze Zahlen und Gleitkommazahlen für die Gleichstellung in jeder Sprache. Es funktioniert für sehr einfache Fälle, aber nachdem Sie überhaupt Mathematik zu tun, der likliehood des Programms zu tun, was Sie wollen, dass es dramatisch abnimmt.
Es hat mit der Art und Weise zu tun Gleitkommazahlen auf einem binären, digitalen System gespeichert werden.
Wenn Sie ganz sicher sind Sie, diese verwenden, eine Klasse erstellen, um Sie mit den Fraktionen besitzen Nummer. Verwenden Sie eine int die ganze Zahl zu halten und eine andere int den Anteil zu erhalten.
Das hängt davon ab, was man „gleich“ in Betracht ziehen. Wenn Sie Ihren Vergleich true zurück, wenn und nur wenn die Doppel genau den Integer-Wert übereinstimmt (das heißt keine Bruchkomponente), sollten Sie Ihre int zu einem Doppel werfen den Vergleich zu tun:
bool isEqual = (double)iValue == dValue;
Wenn so etwas wie 1.1 würde gleich 1 in Betracht gezogen werden, können Sie entweder werfen die Doppel in einen int oder runden Doppel (wenn Sie die Bruchkomponente gänzlich ignoriert werden sollen), wenn Sie 1.9 sagen wollen 2 gleich.
double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
// Put your code here
}
OR
if((val2 - Double.Epsilon) < 0)
{
// Put your code here
}
wo Double.Epsilon ist niedrigstmöglichen Wert für Doppel.
Heute nur um die einzige Zeit, sollte man Werte von Typen double
zu vergleichen und entweder integer
oder long
für strikte Gleichheit wird, wenn aus irgendeinem Grund, ein stuck Speicherung oder Weitergabe integrale Mengen als Gleitkommazahlen und später muss wandeln sie zurück. Eine solche Umwandlung in den meisten Fällen am leichtesten durch Gießen des integralen Typs erreicht werden kann, double
und dann das Ergebnis dieser Guss vergleicht. Beachten Sie, dass die Umwandlung von long
zu double
ungenau sein kann, wenn die Zahl außerhalb des Bereichs ± 2 52 . Trotzdem in den Tagen vor dem 64-Bit-long
zur Verfügung steht, war double
ein handliches Speichertyp für ganzzahlige Mengen, die für zu groß waren, ein 32-Bit-int
aber klein genug, um durch double
behandelt werden.
Beachten Sie, dass ein long
Umwandlung double
und dann den Vergleich macht ein „gleich“ Ergebnis wird ergeben, wenn der Nennwert des double
nicht genau den long
Wert übereinstimmen, aber die nächstmögliche double
auf diesen Wert darstellt. Dieses Verhalten macht Sinn, wenn man erkennt, dass Gleitkommatypen repräsentiert nicht tatsächlich einen einzigen präzisen Wert, sondern einen Wertebereich.