|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
26.07.2012, 20:13 | #1 |
Пользователь
Регистрация: 25.02.2009
Сообщений: 40
|
странная вещь
Написал программу вывода денег по введенному числу. Например, вводится число 15.46 и должно вывестись 15 рублей 46 копеек. Код программы вот:
Код:
|
26.07.2012, 20:26 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Визуал Студия 2010
Результат: Цитата:
I'm learning to live...
|
|
26.07.2012, 21:26 | #3 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Данные хранятся в двоичном виде, и не всегда удается установить абсолютно точное соответствие с десятичным. Если, скажем, с 0.75 проблем нет: 0.75(10) = 1*0.5 + 1*(0.5)^2 = 0.11(2), то многие другие числа удается привести в двоичный вид только приближенно. Так что вместо 25.45 в памяти вполне может храниться что-то вроде 25.4499999... и при округлении (отбрасывании дробной части) эти 0.99999... копеек потеряются.
В принципе если поменять float на double (у него точность выше), то проблема обычно решается. И еще, по поводу вашего кода. Если уж используете стандартную библиотеку (std::cout), то совсем не нужно пользоваться сишными функциями (printf, scanf), их можно заменить стандартными потоками. Кроме того, если нет особой необходимости, то лучше использовать для всех целых чисел тип int, а для дробных - double. Плюс вместо getch опять же посоветую вариант из стандарта C++ Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же Последний раз редактировалось Гром; 26.07.2012 в 21:36. |
27.07.2012, 01:39 | #4 | |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
Цитата:
Чем Ваш вариант лучше?
Спеши медленно.
|
|
27.07.2012, 12:43 | #5 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Тем, что getch, как и вся conio не является POSIX-совместимой, не входит в стандарты ни Си, ни C++ и, к примеру, на Linux придется обходиться без нее. А с cin таких проблем нет в принципе, это стандарт, и он работает везде.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
27.07.2012, 14:24 | #6 |
Пользователь
Регистрация: 25.02.2009
Сообщений: 40
|
Спасибо за объяснение проблемы и советы. Советы учту обязательно. Хочется узнать еще, а как же именно формально использовать вместо getch то что вы написали в коде:
Код:
И еще: функцию printf я использовал для корректировки вывода числа: не 567.4434234234342, а 567.44 допустим. Если не использовать функцию printf то каким образом это можно сделать? Последний раз редактировалось Dimanduc; 27.07.2012 в 14:40. |
27.07.2012, 15:54 | #7 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Да, просто вбить вместо нее. ignore нужен на случай, если в потоке ввода осталось что-то еще не считанное (например, вы ввели в окне два числа, нажали Enter, а в коде был только один cin >> i - одно число считалось, другое осталось висеть в потоке), get - непосредственно дожидается ввода чего-то еще (фактически - необязательный ввод с обязательным нажатием клавиши Enter), после чего программа завершается.
Вместо printf можно использовать манипуляторы, в частности для вывода с определенной точностью - setprecision. Также поищите информацию о других манипуляторах ввода/вывода (например, Б. Страуструп "Язык программирования C++, специальное издание", глава 21.4.6).
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
27.07.2012, 20:29 | #8 | |
Пользователь
Регистрация: 25.02.2009
Сообщений: 40
|
Цитата:
|
|
27.07.2012, 20:55 | #9 |
Старожил
Регистрация: 21.03.2009
Сообщений: 2,193
|
Не iomanip.h, а просто iomanip. Подключение частей стандартной библиотеки с .h - устаревший способ, компилятор вполне может его не поддерживать.
Такой код у меня выводит, как и положено, 25.45 Код:
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта Тема на форуме, посвященная ему же |
27.07.2012, 23:04 | #10 |
Пользователь
Регистрация: 25.02.2009
Сообщений: 40
|
У меня вывод нестабильный. То верно выводит то неверно, но возможно это связано с версией скачанной с неофициального сайта.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
непонятная вещь | Dimanduc | Общие вопросы C/C++ | 41 | 27.07.2012 14:58 |
Непонятная вещь | Doem | HTML и CSS | 3 | 31.03.2011 03:07 |
Рассчитаем незамысловатую вещь) | Владимир_Мар | Общие вопросы Delphi | 1 | 04.06.2010 18:31 |
Как сделать такую вещь? | Mr.Qwerty | Общие вопросы Delphi | 9 | 01.08.2009 05:17 |