Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
1

Непонятка с float

14.04.2014, 22:27. Просмотров 920. Ответов 11
Метки нет (Все метки)

float s = (123 * 100 / 360000);
cout << fixed << setprecision(3) << s;
По идее, в консоли должно вывести "0,034", но видимо с++ не разделяет эту идею.
Пробовал и в отладчике переменную смотреть и разные среды(Code Blocks, MVS 2008).
Всё равно в консоли "0". Я просто смеюсь и плачу, что такая ерунда не получается...
Ах, да, double тоже пробовал.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2014, 22:27
Ответы с готовыми решениями:

опять ошибка.на этот раз cannot convert `float (*)(float)' to `float' in argument passing
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;math.h&gt; float f1(float x)/*vira*enie 1*/ ...

Чем отличаются float преобразования (float)var от float(var)
Здравствуйте! Подскажите, чем отличается (float)var от float(var)

cannot convert `float' to `float*. Почему так происходит?
всем привет, помогите исправить ошибки... а то голова мало варит уже, а завтра надо сдать уже ...

invalid types `float[float]' for array subscript
void SEARCH(float vol, float price, int i) { if (i&gt;N) { if(price&gt;maxprice) ...

11
Заблокирован
14.04.2014, 22:28 2
float s = (123. * 100 / 360000);
1
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
14.04.2014, 22:33  [ТС] 3
А вы не могли бы пояснить, пожалуйста?
0
Заблокирован
14.04.2014, 22:37 4
Все числа 120 100 360000 являются целыми. Поэтому результат действий над ними также будет целым числом.
Только затем полученное целое присваивается float.

Число 123. целым не является. Этого достаточно, чтобы весь результат также не был целым.
Кстати, он будет double. Поэтому приводить его к float - терять точность.

С таким успехом точку можно было поставить после 100 или после 360000.
0
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
14.04.2014, 22:48  [ТС] 5
А если вместо чисел в выражении переменные?
0
Заблокирован
14.04.2014, 23:03 6
Программирование - наука экспериментальная )
Напишите
float a = 123;
float s = (a * 100 / 360000);
И посмотрите, чего выйдет.
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.04.2014, 13:31 7
IrineK, на одних экспериментах базироваться нельзя. Не будешь же проверять всё множество доступных компиляторов. Нужно и к стандарту обращаться (теории) чтобы не было потом "в gcc работает, а в vs - нет" и наоборот.
1
Заблокирован
15.04.2014, 13:57 8
Цитата Сообщение от Tulosba Посмотреть сообщение
Не будешь же проверять всё множество доступных компиляторов.
Ой, нет.
0
Evg
Эксперт CАвтор FAQ
21139 / 8155 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
15.04.2014, 18:38 9
Цитата Сообщение от Denque Посмотреть сообщение
А если вместо чисел в выражении переменные?
Никакой роли не играет. Если у тебя аргументы являются целочисленными (будь то константа или переменная), то оперция построится целочисленная.

Константа "1" - целая, "1.0" - вещественная
0
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
15.04.2014, 19:58  [ТС] 10
Хорошо, а если априори, все константы целочисленные, но результат дробный, например:
C++
1
2
3
4
5
int a = 1;
int b = 3;
float c;
c = a/b;
cout << fixed << setprecision(3) << c;
Результат - 0, как-то совсем не весело...
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.04.2014, 20:21 11
Лучший ответ Сообщение было отмечено Denque как решение

Решение

Denque, тип результата определяется аргументами (a,b), а не типом переменной, которой это всё присваивается. Результат будет целочисленный, и он потом преобразуется к типу переменной (c). Но в итоге, как вы видите, все равно ноль, а не 0.33333(3). Чтобы получить ожидаемый результат надо изменить тип аргумента(ов). Например через static_cast или домножением на 1.0.
1
Evg
Эксперт CАвтор FAQ
21139 / 8155 / 628
Регистрация: 30.03.2009
Сообщений: 22,465
Записей в блоге: 30
15.04.2014, 20:33 12
Цитата Сообщение от Denque Посмотреть сообщение
c = a/b;
Правая часть - выражение, которое нужно присвоить в c. Чтобы что-то присвоить, надо сначала выражение вычислить. Т.е. сначала вычисляется выражение "a/b", которое является целочисленным делением (т.к. оба аргумента целочисленны), и только потом выполяется присваивание целочисленной величины в плавающую переменную. В этом месте в правой части присваивания неявно возникает второе выражение - приведение целочисленной величины к вещественной. Т.е. для "c = a/b" выполняются три действия: целочисленное деление, приведение типа целочисленный -> вещественный, присваивание вещественной величины
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2014, 20:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Неправильное приведение void* к *float а далее к float
Почему когда привожу void* к int* потом к int то все работает, данные не бьются и работают...

Ошибка cannot convert 'float' to 'float*'
Здравствуйте, что означает error: cannot convert 'float' to 'float*' for argument '1' to 'int...

Ошибка преобразования float в float*
Выдает ошибку невозможности преобразование /main.cpp/ #include &lt;iostream&gt; #include &quot;gkh.h&quot; int...

ошибка "invalid operands to binary expression ('float*' and 'float')"
начала писать программу и запоролась на первой же функции double atmosphere(double h_geo) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.