5

Kann jemand mir bitte erklären, was hier passiert:C# float Präzision

using System; 
using System.Text; 

namespace ConsoleApplication1 { 

    class Program { 

     static void Main(string[] args) { 

      object o = 1000000.123f; 
      float f= Convert.ToSingle(o); 
      double d = Convert.ToDouble(f); 

      Console.WriteLine(f.ToString("r")); 
      Console.WriteLine(d.ToString("r")); 

      Console.ReadLine(); 

     } 
    } 
} 

Welche Ausgänge:

1000000,13

1000000,125

ich erwartet hatte:

Das Objekt o einen zugrunde liegenden Float-Typ zu haben (scheint zu passieren [durch Beobachten der Uhr w indow, wo es als Objekt {float} eingegeben wird)

Das 1000000.123f in f als 1.000.000,125 erhalten gespeichert würden (Die IEEE754 Annäherung in 32 Bit?)

Dass die Doppel 1.000.000,125 als auch speichern würde (scheint zu passieren, auch wenn f scheint nicht das zu enthalten, was ich erwartet habe)

Die Frage nach einem Round-Trip-Format auf der ToString würde mir 1000000.125 in beiden Fällen zurückgeben.

Kann mir jemand sagen, was ich falsch mache, um 1000000.13 zu bekommen, wenn Sie f herausziehen?

Antwort

5

Wie Sie bereits festgestellt haben, wird die Zahl 1000000.123 als 1000000.125 gespeichert. Dies wird unverändert von double.ToString() gerendert, aber durch float.ToString() abgeschnitten, weil zu viele Ziffern zu zeigen irreführend ist.

Übrigens gibt es keine Convert.ToSingle(float), denn es würde einfach genau das zurückgeben, was Sie übergeben haben. Ihr Code löst tatsächlich auf Convert.ToSingle(double). Sie konvertieren also (implizit) zu double und dann (explizit) zurück zu float, was im Wesentlichen ein No-Op ist.

Vorsicht: Vertrauen Sie nicht JavaScript Fließkomma Rechner. Einige von ihnen behaupten, dass 1000000.123 als 1000000.1 mit Gleitkommazahlen mit einfacher Genauigkeit gespeichert wird, was vermutlich auf der Annahme beruht, dass IEEE-Gleitkommazahlen, da sie ungefähr 7,22 Stellen der Genauigkeit haben, in 8 Stellen genau dargestellt werden können. Das ist falsch.

+0

danke für die antwort (und die heads up re: meine umwandlung nop). Hat der float.ToString() die Zahl jedoch nicht gerundet? Würde eine Kürzung nicht in 1000000.12 resultieren? –

+0

@StephenEmm: Wenn es auf halbem Weg zwischen zwei Darstellungen steht, rundet es auf (oder weg von Null - nicht sicher, was - aber es macht keinen Unterschied für positive Zahlen). –