Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
#1

Непонятка с float - C++

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

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

непонятка - C++
на парах нам учитель дает зделаную прогу как пример (скорей всего на студия-08) и в компютерном класе оно все работает (там тоже студия...

fstream непонятка - C++
скажите,плз,правильно ли я открываю файл с fstream, и где должен лежать сам файл? #include &lt;fstream&gt; #include &lt;iostream&gt; #include...

Непонятка с указателями - C++
Как так что если указатель на int он покажет свой адрес а на char покажет символ свой. int * pointerInt = new int; char *...

Непонятка с кодировкой - C++
Есть следующий код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using std::wstring; using std::getline; using...

Непонятка со скобками - C++
У меня такой вопрос: есть два куска кода, по сути одинаковых, в одном есть дополнительные скобки, которые по-моему не влияют ни на что, но...

Непонятка с постфиксами в VS 2013 - C++
#include &lt;iostream&gt; using namespace std; int main() { int a = 10; a = a++ + a++; cout &lt;&lt; a &lt;&lt; endl; system(&quot;pause&quot;); ...

Непонятка с заголовочными файлами - C++
game.h #ifndef _GAME_H_ #define _GAME_H_ #include &lt;gl\gl.h&gt; #include &lt;gl\glu.h&gt; #pragma comment (lib,...

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

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

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

Константа "1" - целая, "1.0" - вещественная
Denque
0 / 0 / 1
Регистрация: 19.12.2012
Сообщений: 14
15.04.2014, 19:58  [ТС]     Непонятка с float #10
Хорошо, а если априори, все константы целочисленные, но результат дробный, например:
C++
1
2
3
4
5
int a = 1;
int b = 3;
float c;
c = a/b;
cout << fixed << setprecision(3) << c;
Результат - 0, как-то совсем не весело...
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.04.2014, 20:21     Непонятка с float #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Denque, тип результата определяется аргументами (a,b), а не типом переменной, которой это всё присваивается. Результат будет целочисленный, и он потом преобразуется к типу переменной (c). Но в итоге, как вы видите, все равно ноль, а не 0.33333(3). Чтобы получить ожидаемый результат надо изменить тип аргумента(ов). Например через static_cast или домножением на 1.0.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 20:33     Непонятка с float
Еще ссылки по теме:

Непонятка с минусами в double - C++
такая шляпа вот, почему-то, если if(9.8 - 7.6 == 2.2) cout &lt;&lt; &quot;TRUE&quot; &lt;&lt; endl; else cout &lt;&lt; &quot;FALSE&quot; &lt;&lt; endl; выводит FALSE,...

непонятка в связном списке - C++
есть 2 конструктора - list(const str&amp;) и list() если в main использую 1ый конструктор, то всё работает, если 2ой - ошибка, всякие там...

Непонятка при работе с файлом - C++
Есть проблема при работе с файлом. Нужно удалить гласные из текстового файла. Непонятно, почему без file.seekg(pos) он зацикливается ; ...

Непонятка с tangens-ом в С++3.1 помогите плз. - C++
Пишу программу по учебнику! встретился с тангенс: tg(фи)=-1,5 =&gt; фи=-67 градусов не могу понять как тут вышло -67 градусов ...

Непонятка с функцией(ошибка в коде) - C++
Необходимо вычислить значения нескольких сумм с помощью функций в следующей функции: y=a+4*sum J=2, N+1(3*J^2+J+2)/4+3*sum J=1,N(2*J+3);J...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
15.04.2014, 20:33     Непонятка с float #12
Цитата Сообщение от Denque Посмотреть сообщение
c = a/b;
Правая часть - выражение, которое нужно присвоить в c. Чтобы что-то присвоить, надо сначала выражение вычислить. Т.е. сначала вычисляется выражение "a/b", которое является целочисленным делением (т.к. оба аргумента целочисленны), и только потом выполяется присваивание целочисленной величины в плавающую переменную. В этом месте в правой части присваивания неявно возникает второе выражение - приведение целочисленной величины к вещественной. Т.е. для "c = a/b" выполняются три действия: целочисленное деление, приведение типа целочисленный -> вещественный, присваивание вещественной величины
Yandex
Объявления
15.04.2014, 20:33     Непонятка с float
Ответ Создать тему
Опции темы

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