ПрограммированиеФорумОбщее

Unity3d c#, float aaa = 1/3; ааа получается равной нулю.

#0
14:08, 26 окт 2015

Unity3d c#

float aaa =  1/3;
print (aaa);

выдаёт что 0, как такое возможно? ведь результат 0,333333.

#1
14:14, 26 окт 2015

1.0/3.0 что выдает?

#2
14:15, 26 окт 2015

DedoK
> 1/3

Даёт результат типа int, который вовсе не 0.33333, а именно 0. Делай вот так, -

float aaa =  1.0f/3.0f;
#3
14:19, 26 окт 2015

Даешь больше граблей!

float aaa =  (float)1/3;
#4
14:26, 26 окт 2015

> Даешь больше граблей!

))))))))))))))))))))))))))))))))))))

#5
15:17, 26 окт 2015

Почитай каким суффиксом инициализируется переменная типа float. "1" и "3" это не float

#6
15:29, 26 окт 2015

Belfegnar
> Почитай каким суффиксом инициализируется переменная типа float. "1" и "3" это
> не float
да знаю я, получается то всё равно флоат. Если 1/3 это не флоат, тогда почему (float)1/3 работает?

Просто я думал что получив дробную часть он сам переведёт как например переводит в стринг "ляля"+peremennaya;

#7
15:30, 26 окт 2015

возьми уебник по шарпу и кури до просвещения

#8
15:42, 26 окт 2015

DedoK
> почему (float)1/3 работает?
Потому что (float)1 - это 1f

#9
15:51, 26 окт 2015

DedoK
> Просто я думал что получив дробную часть он сам переведёт
Ничё он не переводит. Для деления целого на целое берётся целочисленное деление. И результат получается целый. Ноль то есть. А потом уже он переводится во флоат.

DedoK
> тогда почему (float)1/3 работает?
Потому что это ((float)1)/3, это деление вещественного на целое, для такого случая берётся вещественное деление.

#10
16:54, 26 окт 2015

DedoK
нет там никакой магии с предвидением)) есть операторы:

static float operator /(float a, float b)
static int operator /(int a, int b)

нужный оператор выбирается исходя из типов параметров. То есть, в результате деления у тебя int и никакой дробной части он там не видит. Тем более, что никто не будет возвращаться в прошлое и менять оператор, когда уже готовый ответ на руках. Операторы вызываются по приоритету + слева направо.
Проблема в том, что int сам преобразуется в float без каких-то специальных операторов преобразования (в отличие от обратного действия, например), что и приводит к подобным ошибкам. Если бы компилятор хотя бы предупреждение выдавал, то ты бы увидел, что у тебя результатом деления является целое (которое нужно потом руками кастануть в float), а не дробь.

#11
20:42, 26 окт 2015

Это не фишка шарпа, а всех языков семейства С. Так что можно взять любой учебник по С.

#12
21:23, 26 окт 2015

kipar
Вроде [citation needed] в какой-то студии

virtual void foo()=3/4;

вполне себе компилировалось как абстрактный метод.

ПрограммированиеФорумОбщее

Тема в архиве.