Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не понятный результат при явном привидении =( 
V
    Опции темы
heforma
Дата 15.9.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Здравствуйте, у меня возникли проблемы при переводе из double в int =( помогите пожалуйста.
Код

#include <iostream>
#include <clocale>
using namespace std;

template <typename t1, typename t2> t1 um (t1 dig,t2 t)
{
    for(int i=0;i<t;i++)
    {
    dig*=10;
    }
    return dig;
}
template <typename t1, typename t2> t1 dl (t1 dig,t2 t)
{
    for(int i=0;i<t;i++)
    {
    dig/=10;
    }
    return dig;
}
double f(double d,int t)
{
    d=um(d,t);
    d=int(d);
    d=dl(d,t);
    int d1=int(d);
    d-=d1;
    d=um(d,t);
    int d2=d;

    return d2;
}
int main()
{
   setlocale(LC_ALL, "");
   double dig;
   int t;
   cout<<"Укажите число:"<<endl;
   cin>>dig;
   cout<<"Укажите количество знаков после запятой:"<<endl;
   cin>>t;
   cout<<"Число с заданой точностью:"<<endl<<f(dig,t)<<endl;
   system("pause");
}

Если вводимым числом принять 1.445 а количество знаков будет равно 3
то в результате я получаю 444 вместо ожидаемых 445
почему так и что сделать что бы вычленить из подобного числа дробную часть?
За ранее благодарен!

Это сообщение отредактировал(а) heforma - 16.9.2011, 05:40
PM MAIL   Вверх
Фантом
Дата 16.9.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 4
Всего: 49



Ваше число 1.445 наверняка выглядит на самом деле как 1.4449999999999 или что-то в этом роде. Соответственно, надо выделить еще одну цифру, кроме требуемых, и если она лежит в пределах от 5 до 9, добавить к последней выводимой цифре единицу.
PM   Вверх
heforma
Дата 16.9.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



Число выглядит вот так "1.445111" а создаваемая мною программа должна обрезать дробь до нужного размера и округлять её.
Даже при вводе числа 1.445 я получаю 444 вместо нужных мне 445 =(
Почему числа округляются? и странным способом?

Это сообщение отредактировал(а) heforma - 16.9.2011, 00:45
PM MAIL   Вверх
mes
Дата 16.9.2011, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(heforma @  15.9.2011,  23:18 Найти цитируемый пост)
Почему числа округляются? и странным способом?

heforma, поможет понять чтение о представленнии чисел с плавающей запятой и нюансах их использования..




Это сообщение отредактировал(а) mes - 16.9.2011, 08:08


--------------------
PM MAIL WWW   Вверх
bsa
Дата 16.9.2011, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(heforma @  16.9.2011,  00:18 Найти цитируемый пост)
Почему числа округляются? и странным способом?

Потому что это арифметика с плавающей точкой.
А потом, выполняя несколько операций умножения ты снижаешь точность. На твоем бы месте, я делал как-то так:
Код
long f(double d, int t)
{
    return static_cast<long>(std::modf(d, 0) * std::pow(10.0, t) + 0.5);
}


Это сообщение отредактировал(а) bsa - 16.9.2011, 08:31
PM   Вверх
heforma
Дата 16.9.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 9.8.2011

Репутация: нет
Всего: нет



bsa, огромное вам спасибо! Вы мне очень помогли! СПАСИБО! =)
Спасибо всем за отклик, ваша информация очень полезна для меня! =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.