Unity3d c#
float aaa = 1/3;
print (aaa);
выдаёт что 0, как такое возможно? ведь результат 0,333333.
1.0/3.0 что выдает?
DedoK
> 1/3
Даёт результат типа int, который вовсе не 0.33333, а именно 0. Делай вот так, -
float aaa = 1.0f/3.0f;
Даешь больше граблей!
float aaa = (float)1/3;
> Даешь больше граблей!
))))))))))))))))))))))))))))))))))))
Почитай каким суффиксом инициализируется переменная типа float. "1" и "3" это не float
Belfegnar
> Почитай каким суффиксом инициализируется переменная типа float. "1" и "3" это
> не float
да знаю я, получается то всё равно флоат. Если 1/3 это не флоат, тогда почему (float)1/3 работает?
Просто я думал что получив дробную часть он сам переведёт как например переводит в стринг "ляля"+peremennaya;
возьми уебник по шарпу и кури до просвещения
DedoK
> почему (float)1/3 работает?
Потому что (float)1 - это 1f
DedoK
> Просто я думал что получив дробную часть он сам переведёт
Ничё он не переводит. Для деления целого на целое берётся целочисленное деление. И результат получается целый. Ноль то есть. А потом уже он переводится во флоат.
DedoK
> тогда почему (float)1/3 работает?
Потому что это ((float)1)/3, это деление вещественного на целое, для такого случая берётся вещественное деление.
DedoK
нет там никакой магии с предвидением)) есть операторы:
static float operator /(float a, float b) static int operator /(int a, int b)
нужный оператор выбирается исходя из типов параметров. То есть, в результате деления у тебя int и никакой дробной части он там не видит. Тем более, что никто не будет возвращаться в прошлое и менять оператор, когда уже готовый ответ на руках. Операторы вызываются по приоритету + слева направо.
Проблема в том, что int сам преобразуется в float без каких-то специальных операторов преобразования (в отличие от обратного действия, например), что и приводит к подобным ошибкам. Если бы компилятор хотя бы предупреждение выдавал, то ты бы увидел, что у тебя результатом деления является целое (которое нужно потом руками кастануть в float), а не дробь.
Это не фишка шарпа, а всех языков семейства С. Так что можно взять любой учебник по С.
kipar
Вроде [citation needed] в какой-то студии
virtual void foo()=3/4;
вполне себе компилировалось как абстрактный метод.
Тема в архиве.