Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для genock94
21 / 21 / 8
Регистрация: 16.11.2012
Сообщений: 349

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

27.07.2014, 18:22. Показов 2693. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2014, 18:22
Ответы с готовыми решениями:

При умножении значения double на int и присвоения его результата на double, результат выходит неправильным
Здравствуйте. Есть такая проблема. При умножении значения double на int и присвоения его результата на double, результат выходить...

Ошибка "Входная строка имела неверный формат" при попытке преобразования типов
в одной форме вводятся данные (цифры) в textBox, в другой форме эти данные должны переводится в другой тип, но этого не происходит...в чем...

Функция преобразования типов: Входная строка имела неверный формат
Добрый день, помогите пожалуйста. Написал код для Функции преобразования типов, а бэйсик выделяет эту строку &quot;B =...

11
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
27.07.2014, 18:25
Обычная ошибка действительных чисел.
Результат получается равным 12.9999999999999999
При преобразовании к целому дробная часть отбрасывается.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
27.07.2014, 18:37
genock94, чтобы понять почему так происходит хорошо бы ознакомиться с представлением вещественных чисел в памяти компьютера. Для этого есть даже стандарт IEEE-754. Имеет смысл почитать хотя бы "по диагонали".
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
27.07.2014, 18:45
если проблема только в округлении можешь юзать вот такой макрос
C++
1
#define Round(x) (x > 0) ? (int) (x + 0.5) : (int) (x - 0.5)
1
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2014, 18:51
Цитата Сообщение от GetHelp Посмотреть сообщение
если проблема только в округлении можешь юзать вот такой макрос
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
27.07.2014, 18:54
Цитата Сообщение от gray_fox Посмотреть сообщение
Уж лучше std::round или самому функцию написать, зачем же макрос сразу?)
может потому что макрос это проще, быстрее и понятней? мне вообще нравятся макросы не скрою
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2014, 19:00
Цитата Сообщение от 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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
27.07.2014, 19:04
gray_fox, ну ты присвой ее чему нибудь...

Добавлено через 1 минуту
вообще хрен знает что с этой ideone, сколько кодов в ней не запускал никогда не компилит... а в студии все норм...
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2014, 19:18
Цитата Сообщение от 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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
27.07.2014, 19:21
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты не понял, проблема не в компиляторе, а в макросе, раскрой его и будет видно в чём проблема... более правильно будет написать этот макрос так:
и чем же мой макрос плох? писал давно, всегда хорошо работал...
Цитата Сообщение от gray_fox Посмотреть сообщение
Но это не все возможные проблемы с макросами; они не знают ничего о типах, пространствах имён и пр.
ну если очень хочется напишите тоже самое через функцию принимающую int... на самом деле просто надо грамотно использовать такой макрос... и никаких проблем не будет
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
27.07.2014, 19:43
Цитата Сообщение от GetHelp Посмотреть сообщение
и чем же мой макрос плох?
Макрос плох тем что это просто подстановка текста по сути, одно неверное движение, и... последствия могут быть не очевидны. Так что проще написать функцию и не иметь подобных проблем. Я не говорю что "макросы не нужны", но здесь можно легко обойтись и без них.
0
39 / 39 / 8
Регистрация: 03.05.2013
Сообщений: 178
27.07.2014, 19:51
http://ru.wikipedia.org/wiki/%... 0%BE%D0%B9

А если нужны более точные вычисления
http://ru.wikipedia.org/wiki/%... 0%B0%D1%8F
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2014, 19:51
Помогаю со студенческими работами здесь

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

Написать функцию int Search ( double A[], int n , double x), которая находит в массиве double A[n] элемент, значение которого равно x
Написать функцию int Search ( double A, int n , double x), которая находит в массиве double A элемент, значение которого равно x. Функция...

Перевод float в int. Неверный результат
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; int main() { float D; int Y; D=1189100068; printf(&quot;D=%f\n&quot;,D); ...

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

Преобразование типов. 3 char в 1 double int, и наоборот.
Здравствуйте, помогите пожалуйста решить следующую задачу. По UART от ПК принимаются пакеты с настройками длиной 9 байт, и...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru