为什么在Windows 10控制台中将无穷大打印为“ 8”?


146

我测试了什么,从分工返回包括零,即0/11/00/0。为此,我使用了类似于以下内容的内容:

Console.WriteLine(1d / 0d);

但是,此代码8不会打印Infinity或输出其他字符串常量,例如PositiveInfinity

为了完整起见,以下所有打印内容8

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(Double.NegativeInfinity);打印-8

为什么此无穷大打印8?


对于那些似乎认为这是一个无限符号而不是八个以下程序的用户:

Console.WriteLine(1d / 0d);

double value = 1d / 0d;
Console.WriteLine(value);

Console.WriteLine(Double.PositiveInfinity);

Console.WriteLine(8);

输出:

无限输出


69
您看到的是无限的迹象。只需将其翻转90度即可看到它8
Mohit Shrivastava

23
您确定它是实际的8,而不是旋转了90度的一些奇怪的无穷大Unicode字符吗?这可能会根据您的区域设置而改变。我在dotnetfiddle.net上尝试过它并打印出来Infinity
Kroltan '16

4
@TheLethalCoder请执行Sinatr建议的操作,或打印的输出Double.PositiveInfinity.ToString()[0] == '8'。在某些字体中,有些外来字符看起来与其他字符非常相似。另外,您的计算机配置为哪种语言?
Kroltan '16

15
这似乎是Windows 10的问题。在Windows 8.1中,我有一个无限符号。几天前升级到Windows 10,现在我也有一个8(德语语言环境)。
勒沃格特

13
一个快速检查将是怎么回事Console.Write("∞");
乔恩·汉纳

Answers:


110

请确保浮点值是:+Infinity如果浮点数被零除-Infinity的分子为正,浮点数被零除NaN的分子为负,浮点数的分子和分母都为零。这就是C#使用的IEEE754浮点规范

在您的情况下,控制台会将无穷大符号(有时在印刷上以水平8 —∞表示)转换为垂直8。


13
@TheLethalCoder该图片没有反驳这个答案,因为它是您的控制台的图片
Rob

9
@Rob我看错了答案,但是这引出了问题,为什么将它转换为8?以及为什么有些小提琴/控制台会打印字符串文字
TheLethalCoder

1
使用调试器时似乎是这种情况,我看到一个无穷大符号(即水平8),是否有任何理由将我的控制台转换为8,而其他人似乎都使用Infinity或类似,即使我使用答案中的代码指定文化的索伦
TheLethalCoder '16

4
它被称为“ lemniscate”。它有一个Unicode值:∞
BlueRaja -丹尼Pflughoeft

14
这可能可以解释为什么Buzz Lightyear会说“到八点及以后!” 当我在PC上玩玩具总动员时。;)
DeanOC '16

70

给定某些设置(即区域性,输出编码等的组合),. NET将输出Unicode无限字符∞(∞/∞)。Windows 10控制台/终端模拟器将(再次进行某些设置-请参见下面的屏幕截图)将此Unicode字符显示为8。

例如,在Windows 10上,使用以下设置(请注意代码页),只需将∞粘贴到控制台中将显示为8。

设置复制

编辑

感谢Chris的评论:似乎输出字体代码页结合可以导致控制台上的∞=> 8问题。像他一样,我在所有尝试过的TrueType字体中都能正确显示∞,并且在选择光栅字体时只能看到8。

字体设置


1
虽然我使用的是“ 437(
OEM-

3
尽管正确的答案是某些设置可能导致此显示问题,但后半部分不正确。目前,我的选项与上面的选项完全相同,并且我得到正确的∞而不是8。如果我进入字体页面并从可用字体列表中选择“光栅字体”,则只能显示8。Consolas,Courier New和其他人似乎都表现得很好……
克里斯

这绝对是两个因素的结合,因为在代码页为437时将字体设置为Raster仍可以正确显示符号。只有同时满足两个条件,这似乎才发生(至少对我而言)。
Moshe Katz

39

8Windows将Unicode转换为旧字符编码时,将出现该符号。由于旧版编码中没有无限符号,因此默认情况下,它对该符号使用“最佳匹配”,本例中为8。请参见Microsoft的“ windows-1252”编码示例。显然,Windows 10 默认仍在控制台中使用旧式字符编码(请参阅“代码页”)。


11
我不知道为什么在语义上容易引起混淆的情况下,“ 8”被认为是很好的选择?代码页437中的其他字符似乎更合适,例如度数符号或per-mille符号(斜杠下方有两个o的百分比)。这些都不能像实际的无穷大符号一样好,但是它们似乎不太容易引起混乱。
supercat

“显然,Windows 10默认情况下仍在控制台中使用默认字符编码。”不,我的Windows 10 cmd.exe开箱即用关闭了旧编码。
Lightness Races in Orbit

这是恕我直言的最佳答案。实际上,您至少还可以在c:\ windows \ system32 \ c_1252.nls文件的Windows 10框中的位置0x2440处看到“ 8”字符(无穷大为0x221E,并且文件中的某些标题解释了偏移量) 。所有代码页编码都有对应的.nls文件。默认情况下,控制台使用1252代码页(Windows 1252)。:注意这些映射将不保,检查此blogs.msdn.microsoft.com/shawnste/2007/09/24/...
西蒙Mourier

35

注意:.ToString()写入Double.PositiveInfinity控制台时,隐式方法调用负责此行为。

呼唤 Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));

产生字符串“ Infinity”

Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr"))); 结果为“ + Infini”。

编辑:正如其他人在Commets中指出的那样,他们无法完全确认我的结果。在另一台机器上进行测试,我得到了两个调用的字符。

感谢评论家vtortola为所有文化提供输出


我找到了(可能)答案:

使用Console.OutputEncoding = Encoding.Unicode;I可以重新创建您在几种文化中遇到的行为,例如“ ru”,“ ru-RU”产生输出8


1
出于兴趣,我尝试了您的示例,它们都显示8
TheLethalCoder

1
@TheLethalCoder我都Infinity进入。您的应用运行哪种文化?检查Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture
vtortola '16

8
@SørenD.Ptæustbh我看不到任何文化都会产生8 dotnetfiddle.net/QYhXMu
vtortola

1
您对隐式是正确的.ToString()。最后,ToString()将返回.PositiveInfinitySymbol相关的NumberFormatInfo。这些似乎取决于运行时的版本和/或Windows(或任何OS)的版本。在过去,CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol它等于"Infinity",但是在运行时和操作系统的较新版本中,它等于"∞"。我只是在对此话题中对汉斯·帕桑特(Hans Passant)的回答的评论中问过的。
Jeppe Stig Nielsen

16

复制代码:

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        var infinity = "\u221e";
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        Console.WriteLine(infinity);
        Console.ReadLine();
    }
}

代码页1252在英格兰是很常见的事故,因为它是那里的默认Windows代码页。正如西欧和美洲一样。有很多原因可以通过编程方式更改默认的Console.OutputEncoding属性,许多文本文件将在1252中进行编码。或者chcp 1252在启动程序之前从命令行键入(chcp == change code page)。

从1252支持的字符集中可以看出,Infinity符号不可用。因此,编码必须提出一个替代方案。这通常是?不支持的Unicode代码点的标志符号,即8位编码的Encoding.EncoderFallback属性值。但是对于1252以及旧版MS-Dos 850和858代码页,Microsoft程序员决定使用8。有趣的家伙。

字形在控制台应用程序通常的代码页支持西方的机器上。437 与旧的IBM字符集匹配。发生此类编码灾难是发明Unicode的原因。可悲的是,要挽救控制台应用程序为时已晚,太多的代码依赖于默认的MS-Dos代码页。

将Double.PositiveInfinity转换为“∞”特定于Win10。在以前的Windows版本中,它曾经是“ Infinity”。通常可以通过“控制面板”>“语言”>“更改日期,时间或数字格式”>“其他设置”按钮修改这些格式,但是对话框中不包括无穷大符号选择。注册表(HKCU \ Control Panel \ International)也不包括在内,而是一个很大的疏忽。在本地winapi中为LOCALE_SPOSINFINITY。在.NET程序中,您可以通过克隆CultureInfo并更改其NumberFormatInfo.PositiveInfinitySymbol属性来以编程方式覆盖它。像这样:

using System;
using System.Text;
using System.Threading;
using System.Globalization;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = Encoding.GetEncoding(1252);
        var ci = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
        ci.NumberFormat.NegativeInfinitySymbol = "-Infinity";
        ci.NumberFormat.PositiveInfinitySymbol = "And beyond";
        Thread.CurrentThread.CurrentCulture = ci;
        Console.WriteLine(1 / 0.0);
        Console.ReadLine();
    }
}

您的代码使我可以确认WinXP使用了代码页437,该代码页在Windows 10中现在显示ý而不是。它还向我展示了使用非光栅字体可以避免该问题。
Mark Hurd

是.NET运行时的版本,还是Windows(或任何操作系统)的版本,或两者的组合,确定是否CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol给出"Infinity""∞"(或其他)信息?您在上面说过,它特定于Windows 10,并且我同意在某些时候对其进行了更改。但是,如果我在具有相同版本.NET Framework的 Windows 8上运行应用程序,是否会得到与Windows 10不同的结果?
Jeppe Stig Nielsen

此问题始于Windows,然后在.NET中暴露了一个怪癖。Win8仍偏爱“ Infinity”
Hans Passant 18'7-12'18

1
已确认!我刚刚登录到Windows Server 2012 R2计算机(大致对应于Windows 8.1),并且我知道它具有最新的.NET Framework,也具有最新的Windows PowerShell。在PowerShell中,$PSVersionTable显示PS版本为5.1。该PowerShell以.NET Framework(CLR)版本4. *为目标,我知道那是该计算机上的新版本。[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbolWindows PowerShell 仍然提供Infinity,而不是(当前文化是en-US)。结论:Windows版本决定,而不是.NET版本。
Jeppe Stig Nielsen

0

运行.Net 4及更高版本时,控制台中将显示“ 8”,表示无穷大,否则以前的版本将显示“ Infinity”。

使用Console.OutputEncoding = Encoding.Unicode; 在.Net 4及更高版本中,∞将显示为∞,但在以前的版本中将引发IOException。

注意:我正在Windows 10 64位上运行Visual Studio 2015社区版

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.