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

War es hilfreich?

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.

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