2016-07-28 16 views
-1

Kann mir bitte jemand helfen mit diesem Problem?Dezimal zu Float Konvertierungsproblem in C#

Ich habe in der Datenbank eine Nullable "echte" Spalte, die Entity Framework als "float?"

Das System führt einige Berechnungen im Dezimalformat durch, aber wenn der Wert in dieser Spalte zugewiesen wird, geht die Genauigkeit verloren.

Das System der nächsten Umwandlung verwendet:

dbObject.floatCol = (float) decimalVar; 

decimalVar ist = 123,12341

aber dbObject.floatCol ist = 123,1234

ich versucht, diese convertion auf andere Weise zu tun, ohne Glück .

HINWEISE:

  1. In der Datenbank ich den Wert auf 123,12341 problemlos aktualisieren können. Ich bin mit Visual Studio 2010 mit .NET Framework
  2. Ich kann die Datenbank der Spalte
  3. nicht ändern 4

EDIT:
Wenn ich debuggen das Problem (mit den reellen Zahlen meiner Ausgabe) ich habe:

decimal decimalVar = new decimal(123.13561); 
// decimalVar is 123.13561 
float? floatVar = 0; 
// floatVar is 0 
floatVar = (float)decimalVar; 
// floatVar is 123.135612 <- has appeared a 2 at the end 

// with a different decimal number 
decimalVar = new decimal(128.13561); // replaced the 123 for 128 
// decimalVar is 128.13561 
floatVar = (float)decimalVar; 
// floatVar is 128.1356 <- has disappeared the 1 at the end 

Das Verhalten ist wirklich seltsam
ich wissen muss, wenn möglich, eine korrekte Konvertierung
zu tun, wenn ich zu p versuchen rint die Werte zu Console oder Logfile sie sind unterschiedlich: s

+0

Die Typzuordnung zwischen C# und SQL Server finden Sie [hier] (https://msdn.microsoft.com/en-us/library/cc716729 (v = VS.100) .aspx) –

Antwort

2

Sie erhalten etwa 7 Stellen Genauigkeit. Das können Sie von einer C# float erwarten. Wenn Sie mehr Präzision benötigen, verwenden Sie stattdessen einen C# double-Wert. Es gibt Ihnen ungefähr 15 bis 16 Stellen Genauigkeit.

double d = (double)decimalVar; 

Ein auch müssen Sie zwischen den C# -Datentypen und den Datenbankdatentypen unterscheiden. In C# ist der beste Datentyp zum Lesen in einer db decimal-Spalte decimal.

Abhängig vom Datenbanktyp werden unterschiedliche Namen für die numerischen Spaltentypen verwendet. Und diese Namen unterscheiden sich von den C# -Typen. Ein SQL-Server float entspricht einem C# double. Ein SQL-Server real entspricht einem C# float (.NET Single).

See: SQL Server Data Type Mappings

Bezüglich Ihrer EDIT: float und double Werte haben eine binäre Darstellung als Gleitpunktzahl intern die Dezimalzahlen erfordert auf die nächste mögliche Übereinstimmung binären Wert gerundet werden. Dieser binäre Wert wird dann zur Anzeige in eine dezimale Darstellung zurückgewandelt. Abhängig davon, ob der Wert auf- oder abgerundet wurde, können Dezimalstellen hinzugefügt oder entfernt werden. Das hast du erfahren.

Siehe Jon Skeet Artikel über Binary floating point and .NET

+0

Danke für die Antwort, ich denke, ich habe keine andere Wahl, als den Datenbanktyp zu ändern. Seltsame Sache ist: Ich kann den Wert in der Datenbank auf 123.12341 aktualisieren, und ich kann ein float var = 123.12341f definieren, aber kann die Konvertierung von Dezimal zu Float nicht korrekt ausführen. –

+0

Es hängt auch von der verwendeten Formatierung ab. Mabe die Nummer hat immer noch die letzte "1" gespeichert, aber es wird nicht standardmäßig angezeigt. Versuchen Sie, den konvertierten Wert anzuzeigen, indem Sie die Ziffern explizit angeben: 'x.ToString (" 0.000000 ")'. –

+0

Ich bearbeitete die Frage, indem ich einen Beispielcode hinzufügte –