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

Умножение 22000.5 на 15 дает 330008, а должно 330007.5 - C++

Восстановить пароль Регистрация
 
Нейкист
 Аватар для Нейкист
11 / 1 / 1
Регистрация: 04.08.2012
Сообщений: 8
06.08.2012, 12:03     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #1
Задание к третьей главе книги Дейтела.
Итак, суть проблемы в том, что при умножении 22000.5 на 15 почему то выводится 330008, хотя должно 330007.5
Вот код, программа из трех файлов:
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Invoice.h"
#include <iostream>
using std::cout;
using std::endl;
 
int main()
{
    Invoice invoice1("Артикул продукта", "Описание продукта", 15, 22000.5);
    cout << "Продукт: " << invoice1.getArticulProduct() << endl
         << "Описание продукта: " << invoice1.getDescriptionProduct() << endl
         << "Количество единиц продукта: " << invoice1.getQuantityProduct() << endl
         << "Цена единицы продукта: " << invoice1.getCostProduct() << endl
         << "Цена за все продукты вместе: " << invoice1.getInvoiceAmount() << endl;
    return 0;
}



Invoice.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef INVOICE_H
#define INVOICE_H
 
#include <string>
using std::string;
 
class Invoice
{
public:
    Invoice(string pArticulProduct, string pDescriptionProduct, int pQuantityProduct, double pCostProduct);//Конструктор
 
    void setArticulProduct(string pArticulProduct);//Устанавливает артикул продукта
    void setDescriptionProduct(string pDescriptionProduct);//Устанавливает описание продукта
    void setQuantityProduct(int pQuantityProduct);//Устанавливает количество единиц продукта
    void setCostProduct(double pCostProduct);//Устанавливает цену единицы продукта
    string getArticulProduct();//Возвращает артикул продукта
    string getDescriptionProduct();//Возвращает описание продукта
    int getQuantityProduct();//Возвращает количество единиц продукта
    double getCostProduct();//Возвращает цену единицы продукта
 
    double getInvoiceAmount();//Возвращает общую цену всех единиц продукта
 
private:
    string articulProduct;//Артикул продукта
    string descriptionProduct;//Описание продукта
    int quantityProduct;//Количество единиц продукта
    double costProduct;//Цена единицы продукта
};
#endif // INVOICE_H



Invoice.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "Invoice.h"
#include <iostream>
using std::cout;
 
Invoice::Invoice(string pArticulProduct, string pDescriptionProduct, int pQuantityProduct, double pCostProduct)//Конструктор класса
{
    setArticulProduct(pArticulProduct);
    setDescriptionProduct(pDescriptionProduct);
    setQuantityProduct(pQuantityProduct);
    setCostProduct(pCostProduct);
}
void Invoice::setArticulProduct(string pArticulProduct)//Устанавливает артикул продукта
{
    articulProduct = pArticulProduct;
}
void Invoice::setDescriptionProduct(string pDescriptionProduct)//Устанавливает описание продукта
{
    descriptionProduct = pDescriptionProduct;
}
void Invoice::setQuantityProduct(int pQuantityProduct)//Устанавливает количество единиц продукта
{
    if(pQuantityProduct >= 0)
    quantityProduct = pQuantityProduct;
    else cout << "Количество единиц продукта не может быть отрицательным!\n";
}
void Invoice::setCostProduct(double pCostProduct)//Устанавливает цену единицы продукта
{
    costProduct = pCostProduct;
}
string Invoice::getArticulProduct()//Возвращает артикул продукта
{
    return articulProduct;
}
string Invoice::getDescriptionProduct()//Возвращает описание продукта
{
    return descriptionProduct;
}
int Invoice::getQuantityProduct()//Возвращает количество единиц продукта
{
    return quantityProduct;
}
double Invoice::getCostProduct()//Возвращает цену единицы продукта
{
    return costProduct;
}
double Invoice::getInvoiceAmount()//Возвращает общую цену всех единиц продукта
{
    return getCostProduct() * getQuantityProduct();
}


В чем может быть проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2012, 12:03     Умножение 22000.5 на 15 дает 330008, а должно 330007.5
Посмотрите здесь:

C++ Ветвления. Дает неправильный результат
C++ WinApi MsgBox в Visual C++ не дает откомплимировать!
Чтение строки из файла дает неправильный вывод C++
Класс Квадратная матрица. Методы: умножение на матрицу, умножение на константу, вывод элементов матрицы на дисплей C++
C++ какие преимущества дает интерфейсное программирование?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.08.2012, 12:10     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #2
я бы постваил brakepoint в нужном месте, пошагово выполнил и проследил, в каком месте происходит нежелательное. можно, конечно, сидеть и смотреть в код и строить догадки, но пройтись в дибаггере будет быстрее и нагляднее.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
06.08.2012, 12:11     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #3
Нейкист, попробуй поставить так :
C++
1
2
3
4
double Invoice::getInvoiceAmount()//Возвращает общую цену всех единиц продукта
{
    return getCostProduct() * double(getQuantityProduct());
}
Нейкист
 Аватар для Нейкист
11 / 1 / 1
Регистрация: 04.08.2012
Сообщений: 8
06.08.2012, 12:17  [ТС]     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #4
Я только неделю пытаюсь c++ учить, и я не представляю как это вообще делается.

Добавлено через 4 минуты
Цитата Сообщение от nexen Посмотреть сообщение
Нейкист, попробуй поставить так :
C++
1
2
3
4
double Invoice::getInvoiceAmount()//Возвращает общую цену всех единиц продукта
{
    return getCostProduct() * double(getQuantityProduct());
}
Не сработало. К тому же вроде неявное приведение типов в любом случае должно было произойти при умножении double и int?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 12:26     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #5
C++
1
cout << fixed  << 22000.5 * 15 << endl;
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
06.08.2012, 12:34     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #6
Функция getInvoiceAmount() всё возвращает правильно - 330007.5, а вот поток вывода округляет результат до 6 значащих цифр, потому и получается 330008. Почитай про настройку вывода double через cout, там должно быть, как выводить фиксированное число цифр после запятой.
-=ЮрА=-
Заблокирован
Автор FAQ
06.08.2012, 12:34     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #7
Цитата Сообщение от Нейкист Посмотреть сообщение
Умножение 22000.5 на 15 дает 330008, а должно 330007.5
- это говорит о том что под ответ выделена недостаточная точность после запятой, поясню на пальцах
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iomanip>
#include <iostream>
using namespace std;
 
int main()
{
     double a = 22000.5;
     double b = 15;
     double c = a*b;
     cout<<a<<" * "<<b<<" = "<<setprecision(0)<<c<<endl;
     return 0;
}
Миниатюры
Умножение 22000.5 на 15 дает 330008, а должно 330007.5  
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
06.08.2012, 12:34     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #8
Нейкист, всё дело в округлении при выводе числа. Используйте std::setprecision или std::fixed(как показано выше).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2012, 12:39     Умножение 22000.5 на 15 дает 330008, а должно 330007.5
Еще ссылки по теме:

C++ Задано 4 матрицы. Провести сложение, умножение, умножение на число
Программа со структурой, не дает себя заполнить C++
String не дает присвоить больше 4х символов C++

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

Или воспользуйтесь поиском по форуму:
Нейкист
 Аватар для Нейкист
11 / 1 / 1
Регистрация: 04.08.2012
Сообщений: 8
06.08.2012, 12:39  [ТС]     Умножение 22000.5 на 15 дает 330008, а должно 330007.5 #9
Всем спасибо!
Yandex
Объявления
06.08.2012, 12:39     Умножение 22000.5 на 15 дает 330008, а должно 330007.5
Ответ Создать тему
Опции темы

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