десятичные дроби, целые числа, литье, о боже!

Я просматриваю книгу "Head First C#" и в одной из глав создал программу и использую переменные, объявленные как целые и десятичные числа. Visual Studio несколько раз раздражала меня из-за смешивания и сопоставления этих двух элементов. Например:

dinnerParty.NumberOfPeople = (int) numericUpDown1.Value;

NumberOfPeople объявлен как int, и, по-видимому, числовые значения updown являются десятичными.

Кроме того, в книге после некоторых чисел ставится буква М при их сложении. Например:

public void SetHealthyOption(bool healthy)
{
    if (healthy)
    {
        CostOfBeveragesPerPerson = 5.00M;
    }
    else
    {
        CostOfBeveragesPerPerson = 20.00M;
    }
}

CostOfBeveragesPerPerson объявляется как десятичное число.

Итак, у меня есть два конкретных вопроса:

1) Как узнать, когда нужно что-то разыграть? Я уверен, что в кастинге довольно много... может ли кто-нибудь предоставить хорошие ссылки, чтобы узнать о кастинге?

2) Что означает буква М после цифр?

ИЗМЕНИТЬ

Таким образом, М означает, что число десятичное, а не двойное. Почему бы просто не указать число как десятичное, например: (десятичное) 50,00? И как эта "функция" называется? Если бы я хотел посмотреть, какие «буквы» доступны, что бы я погуглил?


person Pete    schedule 11.04.2009    source источник
comment
Бит после редактирования действительно должен быть новым вопросом.   -  person RossFabricant    schedule 11.04.2009
comment
Я полагаю, что это могло быть. Я думаю, у меня просто такой менталитет форума, когда вас избегают за то, что вы публикуете слишком много тем или что-то в этом роде. Как вы понимаете, я здесь новичок, поэтому стараюсь делать все по правилам.   -  person Pete    schedule 11.04.2009


Ответы (3)


  1. Явные приведения обычно необходимы, когда между двумя типами есть потеря точности. Например, если у вас есть int и вы присвоили его типу long, приведение не требуется, так как long может содержать все значения, которые может содержать int. Однако если бы вы присваивали значение типа long типу int, потребовалось бы приведение типов, так как тип int может содержать меньше значений, чем тип long, что может привести к потере данных.
  2. M определяет число как тип Decimal. Если вы опустите это, число интерпретируется как двойное.
person Turnor    schedule 11.04.2009
comment
Окей, звучит хорошо. Итак, что произойдет, если я приведу десятичную дробь, скажем, 10,1 к типу int? Тогда это становится 10? А если 10,9? Стало 11 или все еще 10? Что касается M, определяющего число как десятичное, какие еще есть варианты? Как это называется, если я хочу погуглить? - person Pete; 11.04.2009
comment
десятичное (и плавающее, двойное) преобразование в int всегда является случаем удаления десятичной части, округление не выполняется. И 10.1, и 10.9 равны 10 как целое число. Что касается буквенных значений, 10 — это целое число, 10.0 — это двойное число, 10.0F — это число с плавающей запятой, а 10.0M — десятичное число. Хотя понятия не имею, как это официально называется. - person Turnor; 11.04.2009
comment
Вот ссылка, которая объясняет это немного лучше, чем я могу: blackwasp.co.uk/CSharpNumericLiterals.aspx - person Turnor; 11.04.2009
comment
Извините, если я начинаю звучать глупо, но если вы объявляете что-то как число с плавающей запятой, зачем вам нужно добавлять F или M, если вы объявили десятичное число? Зачем объявлять это, если вы можете просто использовать букву, чтобы обозначить, что это такое? - person Pete; 11.04.2009
comment
Ницца! Я отмечу это как ответ. Я думаю, что мне действительно нужно было знать, что такое литерал на самом деле. Использование F или M — это просто ввод жестко закодированного числа на лету. - person Pete; 11.04.2009
comment
Просто кажется, что язык так устроен. Хотя в С# 3.0 то, что вы предлагаете, действительно возможно. Если вы используете ‹code›var number = 1.0f‹/code›, компилятор определит тип ‹code›number‹/code› по его использованию. - person Turnor; 11.04.2009
comment
@Turnor: с числами с плавающей запятой, которые предполагаются неточными, преобразование типов из типов с более низкой точностью в типы с более высокой точностью с гораздо большей вероятностью укажет на ошибку, чем наоборот, несмотря на решение .net. следовать неудачному примеру Java, требующему приведения только для менее проблемного направления. float f = 1.0/10.0; не должен требовать приведения (но требует), поскольку он устанавливает f в наилучшее float представление 0,1; double d = 1.0f/10.0f не требует приведения, но ошибка в присваиваемом значении в миллионы раз больше, чем можно было бы ожидать от double. - person supercat; 10.12.2012
comment
@Turnor: Забавно, что причина, по которой .net кричит при преобразованиях из double в Decimal, вероятно, заключается в том, что такие преобразования могут терять точность или вызывать исключения в некоторых случаях, но на самом деле более проблематичными являются те, в которых Decimal фиксирует именно номинальное значение double на самом деле представляет [в отличие от математического значения, которое оно должно представлять] - person supercat; 10.12.2012

Type    Suffix          Example
uint    U or u          100U
long    L or l          100L
ulong   UL or ul        100UL
float   F or f          123.45F
decimal M or m          123.45M

Существует множество страниц, объясняющих числовые литералы C#. Буква в конце не бросок или любая функция. Это синтаксис, показывающий, что то, что вы пишете, представляет собой значение определенного типа. Таким образом, запись (десятичная) 5.0 использует приведение, а запись 5.0m — нет.

person RossFabricant    schedule 11.04.2009

  1. Вот хорошая ссылка на трансляцию прямо из MSDN .
  2. M сообщает компилятору, что число равно decimal, иначе он будет считать его числом double.
person Alexander Kahoun    schedule 11.04.2009
comment
Спасибо за ссылку! Я добавил этот сайт MSDN в закладки, так как там много полезной информации. - person Pete; 11.04.2009