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

float обнуляет дробную часть - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 02:43     float обнуляет дробную часть #1
Здравствуйте всем!
Я новичок. Поиском не нашел ничего подобного.

Проблема в следующем:
В функцию myfunc по параметру приходит long переменная.
Когда она внутри функции делится на 60 и присваивается в переменную float, то дробная часть все время равна нулю.

C++
1
2
3
4
5
void myfunc (long x)
{
   float a;
   a = x/60;
}
подскажите, пожалуйста, где может быть зарыта собака?)

Пробовал заменить x на число - результат тот же.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.08.2010, 02:53     float обнуляет дробную часть #2
C
1
2
3
4
5
void myfunc (long x)
{
 float a;
 a = 1.0*x/60;
}
здесь проблема преобразования типов: x - целый, x/60 - также будет целым, и только после этого переведется в float

при 1.0*x/60; 1.0*x переведется в double(дробный), потом поделится, и потом в float

можно сделать
a = static_cast<float>(x)/60;
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
12.08.2010, 02:53     float обнуляет дробную часть #3
У Вас происходит целочисленное деление, т.е. при делении дробная часть откидывается.
Чтобы получилось "нормальное" деление нужно чтобы либо делимое либо делитель быть числом (или переменной) "дробного" типа.
В данном случае чтобы 60 имел "дробный" тип нужно записать так:
C
1
a = x/60.;
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 03:05  [ТС]     float обнуляет дробную часть #4
Спасибо большое!
Я тоже об этом подумал, и через static_cast у меня получилось.

Спасибо.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
12.08.2010, 03:05     float обнуляет дробную часть #5
..так сказать завершая, преобразования типов происходят
unsigned -> signed
short -> long -> long long
целых (char,int) -> дробные (float, double)
Цитата Сообщение от Евгений М. Посмотреть сообщение
a = x/60.;
по мне проще порядок слева направо соблюдать, но тоже вариант
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 11:23  [ТС]     float обнуляет дробную часть #6
До варианта с "х/60." никогда бы в жизни не додумался... Зато самый запоминающийся

Добавлено через 1 минуту
Цитата Сообщение от alex_x_x Посмотреть сообщение
..так сказать завершая, преобразования типов происходят
unsigned -> signed
short -> long -> long long
целых (char,int) -> дробные (float, double)
Простите за нескромный вопрос, что сие значит?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.08.2010, 11:25     float обнуляет дробную часть #7
half-node, Порядок преобразования типов
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 11:28  [ТС]     float обнуляет дробную часть #8
Цитата Сообщение от Lavroff Посмотреть сообщение
half-node, Порядок преобразования типов
Надо понимать, при неявном преобразовании?


Нет..Все равно не понимаю, что значит int -> float. Почему не float -> int, ведь такое тоже может быть? Или вообще речь о другом? >_<
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.08.2010, 11:52     float обнуляет дробную часть #9
Цитата Сообщение от half-node Посмотреть сообщение
Нет..Все равно не понимаю, что значит int -> float
Это значит, что в следующем примере ival будет неявно преобразовано к типу float:
C
1
2
3
4
5
int ival = 5;
float fval = 5.4;
// ival сначала преобразуется к float, вычисляется выражение
// и результат присваивается переменной fresult
float fresult = ival + fval;
Если бы в предыдущем примере происходило бы преобразование по правилу float->int, то операция суммирования происходила бы с потерей точности, т.к. при преобразовании плавающего типа к целому дробная часть отбрасывается. В общем случае преобразование производится к типу с большей точностью.
Цитата Сообщение от half-node Посмотреть сообщение
Почему не float -> int, ведь такое тоже может быть
Если под "такое может быть" ты подразумеваешь это, то да:
C
1
2
3
// ival сначала преобразуется к float, вычисляется выражение
//  РЕЗУЛЬТАТ ПРЕОБРАЗУЕТСЯ К INT и присваивается iresult
int iresult = ival + fval;
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 17:50  [ТС]     float обнуляет дробную часть #10
ааа..все. Спасибо.
Еще. Не хотел создавать новую тему.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
            cout << "Enter number: "; cin >> fchis;
            do
            {
                cout << "Want to enter degree? "; cin >> yesno;
                if(yesno=='y')
                {
                    cout << "Degree: "; cin >> stepen;
                    fchis = power(fchis, stepen);
                }
                else if(yesno=='n')
                {
                    fchis = power(fchis);
                }
                else
                {
                    cout << "Enter only \"y\" or \"n\"\n";
                }
            }while ((yesno=='y') || (yesno=='n'));
Этот кусок кода огорчает тем, что в не зависимости от значения yesno, цикл продолжается вечно!
evgeny1503
3 / 3 / 0
Регистрация: 04.07.2010
Сообщений: 24
12.08.2010, 18:14     float обнуляет дробную часть #11
Цитата Сообщение от half-node Посмотреть сообщение
}while ((yesno=='y') || (yesno=='n'));
Я тоже новичок, но тут по ходу не правильно, лучше, наверное так:
Цитата Сообщение от half-node Посмотреть сообщение
}while (yesno=='y');
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 18:19  [ТС]     float обнуляет дробную часть #12
Цитата Сообщение от evgeny1503 Посмотреть сообщение
Я тоже новичок, но тут по ходу не правильно, лучше, наверное так
Ну..у меня как бы тоже самое, только у тебя просто: До тех пор пока есно не равняется игрек.
А у меня: До тех пор пока есно не равняется игрек или эн
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.08.2010, 18:25     float обнуляет дробную часть #13
Не знаю, у меня все работает. Да и у тебя все вроде правильно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <cstdlib>
 
int main(int argc, char **argv)
{
    char ans;
    do
    {
        std::cout << "Input \'y\' or \'n\' or any other key to quit: ";
        std::cin >> ans;
        ans = tolower(ans);
 
        if (ans == 'y')
            std::cout << "Ooh yes!" << std::endl;
        else if (ans == 'n')
            std::cout << "Ooh no!" << std::endl;
        else
            std::cout << "Bye-bye!" << std::endl;
    }
    while ((ans == 'y') || (ans == 'n'));
    return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2010, 18:31     float обнуляет дробную часть
Еще ссылки по теме:

Оставить дробную часть C++
C++ Разбить число на целую и дробную часть
Как задать проверку на дробную часть? C++

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

Или воспользуйтесь поиском по форуму:
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
12.08.2010, 18:31  [ТС]     float обнуляет дробную часть #14
чудеса...
Yandex
Объявления
12.08.2010, 18:31     float обнуляет дробную часть
Ответ Создать тему
Опции темы

Текущее время: 10:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru