Другие языки программирования и технологии

Автоматическое приведение типов (вопрос по С++)

при операции происходит автоматическое округление, к примеру:float k = 100/120; // в результате в k запишется 0float kk = 120/100; // в результате в kk запишется 1Если присвоить без вычислений дробное значение то всё ок:float kkk = 1.1234; // в результате в kkk запишется 1.1234В чём может быть проблема?
Вы делите int на int, получется результат int, если вы поделите так float k = (float)100|120;, то получится флоат, т. к. компилятор при этом приведет 120(ведь оно инт) к типу флоат (к большему типу) и поделит, а результат занесет в флоат, если бы к было инт, то он бы привел его к инт
т. е варианты такие
float k = (float) 100/120;
float k = 100/(float) 120;
float k = (float)100/ (float) 120;
Да, Дмитрий, правильно пишет, если у вас числа, а не переменные, то просто добавьте десятичную точку и все будет ОК
ЕЯ
Евгений Ялтанец
4 573
Лучший ответ
floak k = 100F / 120F;
Алексей Ядров
Алексей Ядров
17 266
Можно также попробовать использовать float-литералы (точнее, они будут double-литералами... )
floak k = 100.0 / 120.0

И так далее.
Добавлю к ответу Артёма. Можно сделать проще:

float k = 100.0 / 120.0;
float k = 100.0 / 120.0;

(без явного приведения типов)
В C++ тип выражения справа от = независит от типа выражения слева. Тип 100 - int, тип 200 - тоже int. Результат деления - тоже int. Численные типы различаются классом точности. В общем случае, порядок точности численных типов данных определяется величиной sizeof(T), хотя на класс точности влияет также наличие модификатора unsigned (например, приведение unsigned int к int вызовет предупреждение, поскольку эти типы принадлежат к разному классу точности) , а также наличие плавающей запятой, конечно же. В выражениях неявное приведение числовых типов происходит от менее точного к более точному, но не наоборот.

Выражение 200.0 / 100 будет иметь тип double, многие компиляторы выдадут предупреждение (а, например, в C#, в котором неявные преобразования типа сведены к минимуму, выражение float f = 200.0 / 100 вообще не пройдёт) .
Правильный вариант - использование суффикса типизации f:

float value = 200f / 100f;