Долго в поплавке, почему? - PullRequest
8 голосов
/ 04 декабря 2010
long b = 99;  
float c = 99.0F;  
//b = c; //Error : Cannot implicitly convert type 'float' to 'long'.
c = b; // Running Successfully.  Why?

Почему нет проблем с размером данных и неявным преобразованием?
Размеры float и long отличаются, как мы знаем, и приведены ниже ...

Console.WriteLine("Long  : " + sizeof(long)); // Output --> Long : 8
Console.WriteLine("Float : " + sizeof(float));// Output --> Float: 4

Ответы [ 4 ]

10 голосов
/ 04 декабря 2010

Диапазон с плавающей точкой (приблизительно ± 3,4e38) на намного больше, чем у длинного диапазона (приблизительно + 9,22e18), даже если у длинной более высокая точность.

5 голосов
/ 04 декабря 2010

Есть 2 причины

1. Диапазон значений (т. Е. Максимальное значение).

+--------------+-----------------------------+
|  data type   |        Maximum Value        |
+--------------+-----------------------------+
|              |                             |
|   long       |     9223372036854775807     |
|              |                             |
|   float      |     3.402823E+38            |
|              |                             |
+--------------+-----------------------------+

As, максимальное значение float равно больше чем long т.е. long содержится внутри float.

So, float= long  is possible
but, long = float is not possible

2. Превосходство
Вы не можете напрямую назначить значение с плавающей запятой в integer (не плавающее) значение без явного преобразования.

float a=90     //correct
float b=90.0f; //correct

но

long a=90     //correct
long b=90.0f; //wrong

Здесь, также из приведенного выше примера, кажется, что float может содержать данные long, но наоборот невозможен.

EDIT: Относительно размера типа данных, см. мой вопрос Является ли диапазон значений зависит от размера типа данных?

1 голос
/ 04 декабря 2010

long представляют тип Int64, т.е. целое число, в то время как число с плавающей точкой представляет тип Single, т.е. И хотя размер long больше размера float, невозможно преобразовать число с плавающей точкой в ​​целое число без потери информации.

Для получения дополнительной информации о типе long и float см. Msdn.

0 голосов
/ 16 декабря 2010

Люди упомянули диапазон с плавающей и длинной, но более простой момент заключается в том, что вы не можете представить большинство возможных чисел с плавающей запятой в целом числе.Если ваш float равен 3.14159, два ближайших значения, которые может представлять long, это 3 или 4 - оба совершенно неверны.Число с плавающей запятой может представлять миллиарды значений, которые лежат между 3 и 4. Также крайне маловероятно, что программист в первую очередь будет использовать значение с плавающей запятой, если он хочет представлять целочисленные значения - это будет очень плохой дизайнрешение.Поэтому неявное преобразование float-> int просто слишком опасно, потому что данные, которые вы почти наверняка потеряете, почти наверняка важны .Это не то, что мы намеренно делаем очень часто, и когда мы делаем это, нам обычно нравится делать это явным (Math.Floor (floatValue)).

Идти в противоположном направлении (int -> float), плаватьобычно может «адекватно» представлять целочисленное значение.Предостережение с плавающей запятой заключается в том, что числа могут храниться только в качестве приблизительного значения - чем больше значение, тем менее точно оно может быть представлено.Тем не менее, точность поплавка составляет около 6 значащих цифр - с потерями, но вы потеряете только около одной миллионной первоначальной стоимости.Во многих случаях это будет незначительным.(В тех случаях, когда значение будет значительным, программисты всегда будут очень осторожны с введением капризов с плавающей запятой в свои вычисления, поэтому на практике это редко вызывает проблемы).Следовательно, более удобно / полезно разрешить неявное преобразование в этом направлении, так как это то, что мы намеренно делаем довольно много.

...