Ich testete , was sich durch die Division mit Nullen dh zurückgegeben wurde 0/1
, 1/0
und 0/0
. Dafür habe ich etwas Ähnliches verwendet:
Console.WriteLine(1d / 0d);
Dieser Code gibt jedoch 8
keine Infinity
oder eine andere Zeichenfolgenkonstante wie aus PositiveInfinity
.
Der Vollständigkeit halber alle folgenden Drucke 8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Und Console.WriteLine(Double.NegativeInfinity);
druckt -8
.
Warum druckt diese Unendlichkeit 8?
Für diejenigen unter Ihnen, die zu denken scheinen, dass dies ein Unendlichkeitssymbol ist, nicht eine Acht, das folgende Programm:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Console.WriteLine(8);
Ausgänge:
∞
ist das Zeichen der Unendlichkeit. Drehen Sie es einfach um 90 Grad, um es zu sehen. 88
, nicht um ein seltsames Unicode-Zeichen für Unendlichkeit handelt, das um 90 Grad gedreht wurde? Dies kann sich je nach Gebietsschema ändern. Ich habe es auf dotnetfiddle.net versucht und es wird gedrucktInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. Es gibt einige exotische Charaktere, die in einigen Schriftarten anderen sehr ähnlich sehen. Für welche Sprache ist Ihr Computer konfiguriert?8
(deutsches Gebietsschema).Console.Write("∞");
Antworten:
Stellen Sie sicher, dass der Gleitkommawert ist,
+Infinity
wenn der Zähler einer Gleitkommadivision durch Null positiv ist,-Infinity
wenn der Zähler einer Gleitkommadivision durch Null negativ ist undNaN
wenn der Zähler und der Nenner einer Gleitkommadivision beide Null sind. Dies steht in der IEEE754-Gleitkommaspezifikation , die von C # verwendet wird.In Ihrem Fall konvertiert die Konsole das Unendlichkeitssymbol (das manchmal typografisch als horizontale 8 - ∞ dargestellt wird) in eine vertikale 8.
quelle
Infinity
oder ähnliches, selbst wenn ich den Code aus der Antwort von verwende Soren durch Angabe der KulturBei bestimmten Einstellungen (z. B. Kombination von Kulturen, Ausgabecodierung usw.) gibt .NET das Unicode-Unendlichkeitszeichen ∞ (∞ / & # 8734;) aus. Der Windows 10-Konsolen- / Terminalemulator zeigt (erneut bestimmte Einstellungen - siehe Abbildung unten) dieses Unicode-Zeichen als 8 an.
Unter Windows 10 wird beispielsweise mit den folgenden Einstellungen (beachten Sie die Codepage) das einfache Einfügen von ∞ in die Konsole als 8 angezeigt.
BEARBEITEN
Dank des Kommentars von Chris : Es scheint, dass die Ausgabeschrift in Kombination mit der Codepage für das Problem ∞ => 8 auf der Konsole verantwortlich ist. Wie er bekomme ich in allen TrueType-Schriftarten, die ich ausprobiert habe, eine korrekte Anzeige von ∞ und sehe nur 8, wenn Raster-Schriftarten ausgewählt sind.
quelle
Das
8
Symbol tritt auf, wenn Windows Unicode in eine Legacy-Zeichencodierung konvertiert. Da die Legacy-Codierung kein Unendlichkeitssymbol enthält, wird standardmäßig eine "beste Anpassung" an dieses Symbol verwendet, in diesem Fall die Nummer 8. Siehe ein Beispiel für die "Windows-1252" -Codierung von Microsoft . Anscheinend verwendet Windows 10 in der Konsole standardmäßig noch ältere Zeichencodierungen (siehe "Codepages" ).quelle
Hinweis: Der implizite
.ToString()
Methodenaufruf beim SchreibenDouble.PositiveInfinity
in die Konsole ist für dieses Verhalten verantwortlich.Berufung
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
ergibt die Zeichenfolge "Infinity"
während
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
ergibt "+ Infini".Bearbeiten: Wie andere in den Commets betont haben, können sie meine Ergebnisse nicht vollständig bestätigen. Wenn ich das auf einer anderen Maschine teste, bekomme ich den Charakter
∞
für beide Anrufe.Ausgabe für alle Kulturen dank vtortola in den Kommentaren.
Ich habe eine (wahrscheinliche) Antwort gefunden:
Mit
Console.OutputEncoding = Encoding.Unicode;
I kann ich das Verhalten, das Sie für mehrere Kulturen erleben, nachbilden, z. B. "ru", "ru-RU", um die Ausgabe zu erzeugen8
.quelle
Infinity
in beiden. Welche Kultur hat Ihre App? Überprüfen SieThread.CurrentThread.CurrentCulture
undThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. Am EndeToString()
wird das.PositiveInfinitySymbol
der relevanten zurückgegebenNumberFormatInfo
. Diese scheinen von der Laufzeitversion und / oder der Windows-Version (oder einem anderen Betriebssystem) abzuhängen. In den alten TagenCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
wäre das gleich"Infinity"
, aber mit neueren Versionen der Laufzeit und des Betriebssystems ist es"∞"
stattdessen. Ich habe gerade in einem Kommentar zu Hans Passants Antwort in diesem Thread danach gefragt.Repro-Code:
Codepage 1252 ist ein ziemlich häufiger Unfall in England, da es dort die Standard-Windows-Codepage ist. Wie für Westeuropa und Amerika. Viele Gründe, die Standardeigenschaft Console.OutputEncoding programmgesteuert zu ändern, viele Textdateien werden 1252 codiert. Oder über die Befehlszeile durch Eingabe
chcp 1252
(chcp == change code page) ein, bevor Sie das Programm starten.Wie Sie dem von 1252 unterstützten Zeichensatz entnehmen können, ist das Unendlichkeitssymbol nicht verfügbar. Die Kodierung muss also einen Ersatz finden. Dies ist häufig die
?
Glyphe für nicht unterstützte Unicode-Codepunkte, der Encoding.EncoderFallback-Eigenschaftswert für 8-Bit-Codierungen. Für 1252 und die alten MS-Dos 850- und 858-Codepages entschied sich der Microsoft-Programmierer jedoch für8
. Lustiger Kerl.Die Glyphe wird in der üblichen Codepage für Konsolen-Apps auf einem westlichen Computer unterstützt. Das ist 437, entspricht dem alten IBM-Zeichensatz . Aufgrund dieser Art von Codierungskatastrophen wurde Unicode erfunden. Leider zu spät, um Konsolen-Apps zu retten, viel zu viel Code, der auf der Standard-MS-Dos-Codepage basiert.
Die Konvertierung von Double.PositiveInfinity in "∞" ist spezifisch für Win10. In früheren Windows-Versionen war es "Infinity". Diese Formate können normalerweise über Systemsteuerung> Sprache> Datums-, Uhrzeit- oder Zahlenformate ändern> Schaltfläche Zusätzliche Einstellungen geändert werden. Die Auswahl des Unendlichkeitssymbols ist jedoch nicht im Dialogfeld enthalten. Auch nicht von der Registrierung abgedeckt (HKCU \ Control Panel \ International), eher ein großes Versehen. Es ist LOCALE_SPOSINFINITY im nativen Winapi. In einem .NET-Programm können Sie es programmgesteuert überschreiben, indem Sie CultureInfo klonen und seine NumberFormatInfo.PositiveInfinitySymbol-Eigenschaft ändern. So was:
quelle
ý
anstelle von gedruckt wird∞
. Es hat mir auch gezeigt, dass die Verwendung von Nicht-Raster-Schriftarten das Problem vermeidet.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
gibt"Infinity"
oder"∞"
(oder etwas anderes)? Sie sagen oben, dass es spezifisch für Windows 10 ist, und ich stimme zu, dass es irgendwann geändert wurde. Wenn ich jedoch eine Anwendung unter Windows 8 mit "derselben" Version von .NET Framework ausführe , erhalte ich dann ein anderes Ergebnis als unter Windows 10?$PSVersionTable
zeigt sich , dass die PS-Version etwas mit 5.1 ist. Diese PowerShell zielt auf die .NET Framework (CLR) -Version 4 ab. * Ich weiß, dass sie auf diesem Computer neu ist. Noch[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
von Windows gibt PowerShellInfinity
nicht∞
(aktuelle Kultur isten-US
). Fazit: Die Windows-Version entscheidet, nicht die .NET-Version."8" für unendlich wird in der Konsole angezeigt, wenn .Net 4 und höher ausgeführt wird, andernfalls wird in früheren Versionen "unendlich" angezeigt.
Verwenden von Console.OutputEncoding = Encoding.Unicode; In .NET 4 und höher wird die Unendlichkeit als ∞ angezeigt, in früheren Versionen wird jedoch eine IOException ausgelöst.
HINWEIS: Ich verwende Visual Studio 2015 Community Edition unter Windows 10 64-Bit
quelle