Я испытывал то , что было возвращено от деления , включая нули т 0/1
, 1/0
и 0/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);
Выходы:
∞
это знак бесконечности. просто переверните его на 90 градусов, чтобы увидеть его 88
, а не какой-то странный Unicode-символ для бесконечности, повернутый на 90 градусов? Это может измениться в зависимости от вашей локали. Я попробовал это на dotnetfiddle.net, и он печатаетInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. В некоторых шрифтах есть некоторые экзотические символы, которые очень похожи на других. Кроме того, на каком языке настроен ваш компьютер?8
тоже есть (немецкий язык).Console.Write("∞");
Ответы:
Будьте уверены, что значение с плавающей запятой имеет место,
+Infinity
если числитель деления с плавающей запятой на ноль является положительным,-Infinity
если числитель деления с плавающей запятой на ноль является отрицательным, иNaN
если числитель и знаменатель деления с плавающей запятой оба равны нулю. Это в спецификации IEEE754 с плавающей точкой , которую использует C #.В вашем случае консоль преобразует символ бесконечности (который иногда типографски представлен как горизонтальный 8 - ∞) в вертикальный 8.
источник
Infinity
или похожи, даже если я использую код из ответа Сорен, указав культуруПри определенных настройках (т. Е. Комбинации культур, выходной кодировки и т. Д.) .NET будет выводить символ бесконечности Unicode ∞ (∞ / & # 8734;). Эмулятор консоли / терминала Windows 10 (опять же при определенных настройках - см. Скриншот ниже) отображает этот символ Unicode как 8.
Например, в Windows 10 с приведенными ниже настройками (обратите внимание на кодовую страницу) просто вставка ∞ в консоль отображается как 8.
РЕДАКТИРОВАТЬ
Благодаря комментарию Криса : кажется, что выходной шрифт в сочетании с кодовой страницей отвечает за проблему ∞ => 8 на консоли. Как и он, я получаю правильное отображение ∞ во всех шрифтах TrueType, которые я пробовал, и вижу только 8, когда выбраны растровые шрифты.
источник
8
Символ происходит , когда Windows , преобразует Unicode в кодировку символов наследия. Поскольку в устаревшей кодировке нет символа бесконечности, он по умолчанию использует «наилучшую подгонку» к этому символу, в данном случае это номер 8. См. Пример кодировки Microsoft «windows-1252» . По-видимому, Windows 10 по- прежнему использует устаревшие кодировки символов по умолчанию в консоли (см. «Кодовые страницы» ).источник
Примечание. За это отвечает неявный
.ToString()
вызов метода при записиDouble.PositiveInfinity
в консоль.призвание
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
Результаты в строке "Бесконечность"
в то время как
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
результаты в "+ Infini".Изменить: Как отмечалось в комментариях другие, они не могут полностью подтвердить мои результаты. Тестируя это на другой машине, я получаю персонажа
∞
для обоих вызовов.Выход для всех культур , благодаря вторторола в комментариях.
Я нашел (вероятный) ответ:
Использование
Console.OutputEncoding = Encoding.Unicode;
I может воссоздать поведение, которое вы испытываете для нескольких культур, например, «ru», «ru-RU» выдают результат8
.источник
Infinity
в обоих. Какую культуру использует ваше приложение? ПроверьтеThread.CurrentThread.CurrentCulture
иThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. В конце концов,ToString()
вернется.PositiveInfinitySymbol
соответствующийNumberFormatInfo
. Кажется, что они зависят от версии среды выполнения и / или версии Windows (или любой другой ОС). В старые временаCultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
было бы равным"Infinity"
, но с более новыми версиями среды выполнения и операционной системы это"∞"
вместо. Я просто спросил об этом в комментарии к ответу Ханса Пассанта в этой теме.Код репро:
Кодовая страница 1252 - довольно распространенная авария в Англии, поскольку там есть кодовая страница Windows по умолчанию. Как это для Западной Европы и Америки. Множество причин для изменения стандартного свойства Console.OutputEncoding по умолчанию, многие текстовые файлы будут закодированы в 1252. Или из командной строки
chcp 1252
введите (chcp == изменить кодовую страницу) перед запуском программы.Как видно из набора символов, поддерживаемого 1252, символ бесконечности недоступен. Таким образом, кодировка должна придумать замену. Это часто
?
символ для неподдерживаемых кодовых точек Unicode, значение свойства Encoding.EncoderFallback для 8-битных кодировок. Но для 1252 и устаревших кодовых страниц MS-Dos 850 и 858 программист Microsoft решил8
. Веселый парень.Глиф это поддерживается в обычной кодовой страницы для консольных приложений на западной машине. То есть 437, соответствует устаревшему набору символов IBM . Именно такие бедствия кодирования - вот почему был изобретен Unicode. К сожалению, слишком поздно, чтобы спасти консольные приложения, слишком много кода вокруг, который полагался на кодовую страницу MS-Dos по умолчанию.
Преобразование Double.PositiveInfinity в «∞» относится к Win10. Раньше это был «Бесконечность» в предыдущих версиях Windows. Такие форматы обычно можно изменить с помощью панели управления> Язык> Изменить формат даты, времени или числа> кнопку Дополнительные настройки, но выбор символа бесконечности не включен в диалог. Также не охватывается реестром (HKCU \ Control Panel \ International), довольно большой недосмотр. Это LOCALE_SPOSINFINITY в родном винапи. В .NET-программе вы можете переопределить ее программно, клонировав CultureInfo и изменив его свойство NumberFormatInfo.PositiveInfinitySymbol. Как это:
источник
ý
вместо∞
. Это также показало мне, что использование не растровых шрифтов позволяет избежать этой проблемы.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
дает"Infinity"
или"∞"
(или что-то еще)? Вы говорите выше, что это специфично для Windows 10, и я согласен, что он был изменен в какой-то момент. Но если я запущу приложение в Windows 8 с «той же» версией .NET Framework , получу ли я другой результат, чем в Windows 10?$PSVersionTable
раскрывает версию PS что-то с 5.1. Этот PowerShell предназначен для .NET Framework (CLR) версии 4. *, которая, как я знаю, является новой для этой машины. Еще[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
из Windows PowerShell выдаетInfinity
, а не∞
(текущая культура естьen-US
). Вывод: решает версия Windows, а не версия .NET.«8» для бесконечности отображается в консоли при запуске .Net 4 и выше, в противном случае предыдущие версии отображают «Бесконечность».
Using Console.OutputEncoding = Encoding.Unicode; в .Net 4 и выше бесконечность будет отображаться как ∞, но в предыдущих версиях выдает исключение IOException.
ПРИМЕЧАНИЕ. Я использую Visual Studio 2015 Community Edition в 64-разрядной версии Windows 10.
источник