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

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

Восстановить пароль Регистрация
 
genock94
 Аватар для genock94
19 / 19 / 1
Регистрация: 16.11.2012
Сообщений: 348
27.07.2014, 18:22     Неверный результат при преобразования типов данных static_cast<int>(double) #1
Доброго времени суток, уважаемые программисты!
Перейду сразу к сути проблемы:
При данном значении вещественной переменной 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2014, 18:22     Неверный результат при преобразования типов данных static_cast<int>(double)
Посмотрите здесь:

static_cast и явное преобразование типов C++
C++ При вычислении выражения выдается неверный результат
C++ Создать перегружаемые функции и шаблоны для типов int и double
Программа преобразования типов данных С++ C++
Используя перегрузки, написать функцию для выполнения действий, для следующих типов данных: float, int, double C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
27.07.2014, 18:25     Неверный результат при преобразования типов данных static_cast<int>(double) #2
Обычная ошибка действительных чисел.
Результат получается равным 12.9999999999999999
При преобразовании к целому дробная часть отбрасывается.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.07.2014, 18:37     Неверный результат при преобразования типов данных static_cast<int>(double) #3
genock94, чтобы понять почему так происходит хорошо бы ознакомиться с представлением вещественных чисел в памяти компьютера. Для этого есть даже стандарт IEEE-754. Имеет смысл почитать хотя бы "по диагонали".
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 18:45     Неверный результат при преобразования типов данных static_cast<int>(double) #4
если проблема только в округлении можешь юзать вот такой макрос
C++
1
#define Round(x) (x > 0) ? (int) (x + 0.5) : (int) (x - 0.5)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
27.07.2014, 18:51     Неверный результат при преобразования типов данных static_cast<int>(double) #5
Цитата Сообщение от GetHelp Посмотреть сообщение
если проблема только в округлении можешь юзать вот такой макрос
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 18:54     Неверный результат при преобразования типов данных static_cast<int>(double) #6
Цитата Сообщение от gray_fox Посмотреть сообщение
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
может потому что макрос это проще, быстрее и понятней? мне вообще нравятся макросы не скрою
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
27.07.2014, 19:00     Неверный результат при преобразования типов данных static_cast<int>(double) #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
)
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 19:04     Неверный результат при преобразования типов данных static_cast<int>(double) #8
gray_fox, ну ты присвой ее чему нибудь...

Добавлено через 1 минуту
вообще хрен знает что с этой ideone, сколько кодов в ней не запускал никогда не компилит... а в студии все норм...
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
27.07.2014, 19:18     Неверный результат при преобразования типов данных static_cast<int>(double) #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 Посмотреть сообщение
т.к. вычисляются ещё до компиляции
Т.е. не "вычисляются", а макроподстановка проводится на стадии препроцессирования, до компиляции.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
27.07.2014, 19:21     Неверный результат при преобразования типов данных static_cast<int>(double) #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты не понял, проблема не в компиляторе, а в макросе, раскрой его и будет видно в чём проблема... более правильно будет написать этот макрос так:
и чем же мой макрос плох? писал давно, всегда хорошо работал...
Цитата Сообщение от gray_fox Посмотреть сообщение
Но это не все возможные проблемы с макросами; они не знают ничего о типах, пространствах имён и пр.
ну если очень хочется напишите тоже самое через функцию принимающую int... на самом деле просто надо грамотно использовать такой макрос... и никаких проблем не будет
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
27.07.2014, 19:43     Неверный результат при преобразования типов данных static_cast<int>(double) #11
Цитата Сообщение от GetHelp Посмотреть сообщение
и чем же мой макрос плох?
Макрос плох тем что это просто подстановка текста по сути, одно неверное движение, и... последствия могут быть не очевидны. Так что проще написать функцию и не иметь подобных проблем. Я не говорю что "макросы не нужны", но здесь можно легко обойтись и без них.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2014, 19:51     Неверный результат при преобразования типов данных static_cast<int>(double)
Еще ссылки по теме:

Double to int, результат на 1 меньше ожидаемого C++
C++ Конфликт типов (int, double, bool)
Преобразование типов double в int для задания размерности массива C++

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

Или воспользуйтесь поиском по форуму:
Winorun
38 / 38 / 4
Регистрация: 03.05.2013
Сообщений: 177
27.07.2014, 19:51     Неверный результат при преобразования типов данных static_cast<int>(double) #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
Yandex
Объявления
27.07.2014, 19:51     Неверный результат при преобразования типов данных static_cast<int>(double)
Ответ Создать тему
Опции темы

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