С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
genock94
20 / 20 / 1
Регистрация: 16.11.2012
Сообщений: 348
#1

Неверный результат при преобразования типов данных static_cast<int>(double) - C++

27.07.2014, 18:22. Просмотров 636. Ответов 11
Метки нет (Все метки)

Доброго времени суток, уважаемые программисты!
Перейду сразу к сути проблемы:
При данном значении вещественной переменной n (n=0.13) в переменной целого типа m результат не 13, а 12. В чём проблема?
C++
1
2
3
double n=0.13;
 
int m = static_cast<int>(0.13*100);
А при n=0.133333 в переменной сохраняется 13...
Вот код самой программы:
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
#include <iostream>      
#include <windows.h>    
 
using namespace std;
 
int main(){
    setlocale(LC_ALL, "Russian");
 
    double sum;
    int celCh;
    double drobCh;
    int vPensah;
    //int funt, shil, pens;
    
    cout << "Введите сумму в новой денежной системе (например: 5.13): ";
    cin >> sum;
    celCh = static_cast<int>(sum);
    drobCh = sum - static_cast<double>(celCh);
    vPensah = celCh * 12 * 20 + static_cast<int>(drobCh*100);
     
    cout << celCh << endl << drobCh << endl << vPensah << endl;
 
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2014, 18:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неверный результат при преобразования типов данных static_cast<int>(double) (C++):

Используя перегрузки, написать функцию для выполнения действий, для следующих типов данных: float, int, double - C++
Используя перегрузки, написать функцию для выполнения действий, для следующих типов данных float, int, double, long: приведение типов.

Конфликт типов (int, double, bool) - C++
Есть простейший класс class A { public: A( long ) {} A( double ){} A( bool ) {} } и при создании обьекта new...

Некорректное преобразование double в int (приведение типов) - C++
Не совсем очевидно. https://ideone.com/7P0EhY #include &lt;iostream&gt; #include &lt;math.h&gt; int main() { float y = pow(64, 1.0...

Результат преобразования int в float - C++
Доброго времени суток,пример unsigned int sande1=0,sande2=0; void TForm1::mat_tt(){ float dat=0.0; int posred=0; ...

Преобразование типов double в int для задания размерности массива - C++
Объясните, пожалуйста. Не объявляется массив, хотя его размеры объявил как константы. // #ifndef M_PI #define M_PI...

Создать перегружаемые функции и шаблоны для типов int и double - C++
Создать перегружаемые функции и шаблоны для типов int и double. Передачу параметров в функцию осуществить различными способами: с помощью...

11
zss
Модератор
Эксперт С++
6588 / 6150 / 2025
Регистрация: 18.12.2011
Сообщений: 16,039
Завершенные тесты: 1
27.07.2014, 18:25 #2
Обычная ошибка действительных чисел.
Результат получается равным 12.9999999999999999
При преобразовании к целому дробная часть отбрасывается.
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.07.2014, 18:37 #3
genock94, чтобы понять почему так происходит хорошо бы ознакомиться с представлением вещественных чисел в памяти компьютера. Для этого есть даже стандарт IEEE-754. Имеет смысл почитать хотя бы "по диагонали".
1
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 18:45 #4
если проблема только в округлении можешь юзать вот такой макрос
C++
1
#define Round(x) (x > 0) ? (int) (x + 0.5) : (int) (x - 0.5)
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.07.2014, 18:51 #5
Цитата Сообщение от GetHelp Посмотреть сообщение
если проблема только в округлении можешь юзать вот такой макрос
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
1
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 18:54 #6
Цитата Сообщение от gray_fox Посмотреть сообщение
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
может потому что макрос это проще, быстрее и понятней? мне вообще нравятся макросы не скрою
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.07.2014, 19:00 #7
Цитата Сообщение от GetHelp Посмотреть сообщение
может потому что макрос это проще, быстрее и понятней? мне вообще нравятся макросы не скрою
дадада...
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
 
#define Round(x) (x > 0) ? (int) (x + 0.5) : (int) (x - 0.5)
 
 
int main() {
    std::cout << Round(0.7) << std::endl; 
}
http://ideone.com/GNYWAi
)
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 19:04 #8
gray_fox, ну ты присвой ее чему нибудь...

Добавлено через 1 минуту
вообще хрен знает что с этой ideone, сколько кодов в ней не запускал никогда не компилит... а в студии все норм...
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.07.2014, 19:18 #9
Цитата Сообщение от GetHelp Посмотреть сообщение
вообще хрен знает что с этой ideone, сколько кодов в ней не запускал никогда не компилит... а в студии все норм...
) Ты не понял, проблема не в компиляторе, а в макросе, раскрой его и будет видно в чём проблема... более правильно будет написать этот макрос так:
C++
1
#define Round(x) (((x) > 0) ? (int) ((x) + 0.5) : (int) ((x) - 0.5))
Но это не все возможные проблемы с макросами; они не знают ничего о типах, пространствах имён и пр., т.к. вычисляются ещё до компиляции; чего только стоят макросы min и max из <windows.h> (если не ошибаюсь)...

Добавлено через 8 минут
Цитата Сообщение от gray_fox Посмотреть сообщение
т.к. вычисляются ещё до компиляции
Т.е. не "вычисляются", а макроподстановка проводится на стадии препроцессирования, до компиляции.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 19:21 #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты не понял, проблема не в компиляторе, а в макросе, раскрой его и будет видно в чём проблема... более правильно будет написать этот макрос так:
и чем же мой макрос плох? писал давно, всегда хорошо работал...
Цитата Сообщение от gray_fox Посмотреть сообщение
Но это не все возможные проблемы с макросами; они не знают ничего о типах, пространствах имён и пр.
ну если очень хочется напишите тоже самое через функцию принимающую int... на самом деле просто надо грамотно использовать такой макрос... и никаких проблем не будет
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
27.07.2014, 19:43 #11
Цитата Сообщение от GetHelp Посмотреть сообщение
и чем же мой макрос плох?
Макрос плох тем что это просто подстановка текста по сути, одно неверное движение, и... последствия могут быть не очевидны. Так что проще написать функцию и не иметь подобных проблем. Я не говорю что "макросы не нужны", но здесь можно легко обойтись и без них.
0
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
27.07.2014, 19:51 #12
http://ru.wikipedia.org/wiki/%D0%A7%...82%D0%BE%D0%B9

А если нужны более точные вычисления
http://ru.wikipedia.org/wiki/%D0%A4%...82%D0%B0%D1%8F
1
27.07.2014, 19:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 19:51
Привет! Вот еще темы с ответами:

For power int double что за результат? - C++
Не понимаю что не так, помогите(((( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;locale.h&quot; #include&lt;cmath&gt; int main() ...

Double to int, результат на 1 меньше ожидаемого - C++
Здравствуйте! в программе были такие строчки кода: double a = 89.0; int b = a; qDebug() &lt;&lt; a &lt;&lt; &quot; &quot; &lt;&lt; b; в b почему то...

Преобразования типов данных - C++
Допустим если объявить функцию Determinant типа void, как сделать чтоб возвращаемые ей значения return(d) были типа int ? #include...

Программа преобразования типов данных С++ - C++
Ребят,у меня проблема,пишу курсовую и нужно в курсовую поместить программу преобразования типов данных (любых которые доступны в С++)....


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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