powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / преобразование типов int, double
15 сообщений из 15, страница 1 из 1
преобразование типов int, double
    #33293526
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот код:

Код: plaintext
1.
2.
double money =  26880 . 0 ;
int sum = money;

После этого sum равен 26879.

Использую BCB6. Столкнулся с этой проблемой в коде программы, но когда решил для проверки вынести этот код в отдельный тест, то все работает правильно. 8-(

Почему так получается и как написать правильно, чтобы не искажались значения?
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294003
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте
double a = 12345.0;
int i = trunc(a);

дело в том, что вещественные числа хранятся нормализованными, в виде
.12345E5 только дробь двоичная, а не десятичная и поэтому это число может отличаться от того, которое отображается на какую-нибудь дельту (очень маленькую). При присвоении целому оно обрезается.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294559
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функцию trunc я вообще не нашел. Она кажется из паскаля. В стандартной библиотеке не нашлось вообще функции вычисления целой части. Есть только modf, но с ней получается тот же результат.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void func( double money )
{
    int sum;
    double tmp;
    modf(money, &tmp);
// Здесь tmp уже равно 26879
    sum = tmp;

// ...
}

func( 26880 );

Самое смешное, что когда создаю новый проект, вставляю туда этот же код - все правильно считается.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294567
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот более точное описание происхождения ошибки. "Работает" везде.

Код: plaintext
1.
2.
3.
4.
 double a =  137661 . 11 ;
 double b =  110781 . 11 ;
 int money = a - b;
// money равно 26879 вместо 26880
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294572
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenissioВот более точное описание происхождения ошибки. "Работает" везде.
Ага... а кроме этого еще ВЕЗДЕ написано не использовать double для работы с целыми числами.
Надо считать деньги - используй long int, пиши туда копейки а при вводе-выводе подставляй точку. И будет тебе щастье.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294728
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда присваиваешь целому нецелое, то прибавляй 0.5

int money = a - b + 0.5;

Для отрицательных подумай сам.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33294994
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenissioФункцию trunc я вообще не нашел. Она кажется из паскаля. В стандартной библиотеке не нашлось вообще функции вычисления целой части. Есть только modf, но с ней получается тот же результат.

Не бывает у числа с плавающей точкой целой части. Поэтому и функции нету.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33295134
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея с long int похоже самая подходящая.

Но я решил проблему так, чтобы не переписывать чужой код:
Код: plaintext
1.
2.
    sprintf( bufint, "%.2f", money );
    sum = atoi( bufint );
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33296605
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простите, floor - потолок - округление снизу и ceil - пол - сверху.

ASSERT(2 != floor(2.9999999));
ASSERT(-3 != floor(-2.9999999));
ASSERT(3 != ceil(2.9999999));
ASSERT(-2 != ceil(-2.9999999));
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33296845
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floor тоже не помогает:

Код: plaintext
1.
2.
3.
4.
 double a =  137661 . 11 ;
 double b =  110781 . 11 ;
 int money = floor(a - b);
// money равно 26879 вместо 26880
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33296973
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denissiofloor тоже не помогает:

Код: plaintext
1.
2.
3.
4.
 double a =  137661 . 11 ;
 double b =  110781 . 11 ;
 int money = floor(a - b);
// money равно 26879 вместо 26880


Тебе не это лечить надо, днк лечить надо. Никогда ты не получишь точно того целого, которое ожидаешь, на двух произвольных числах. Потому что числа в ЭВМ - двоичные, а не десятичные.
Нужны десятичные числа -- используй ДЕСЯТИЧНЫЕ числа, а не двоичные (float, double). В С\С++ встроенных их нет, поэтому надо пользоваться библиотеками типа gnu mp.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33296974
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denissiofloor тоже не помогает:

Код: plaintext
1.
2.
3.
4.
 double a =  137661 . 11 ;
 double b =  110781 . 11 ;
 int money = floor(a - b);
// money равно 26879 вместо 26880

дарю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
#include <math.h>

double round(double value, double precision)
{
    double ret, r = value * pow( 10 . 0 , precision +  1 . 0 );
    r += (value <  0 )? - 5 . 0 :  5 . 0 ;
    r /=  10 . 0 ;
    modf(r, &ret);
    for(;precision;precision--)ret/= 10 ;
    return ret;
}

void main()
{
	double a =  137661 . 11 ;
	double b =  110781 . 11 ;	
	int money = (int)round(a - b,  0 );
	return;
}
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33297053
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ещё длиннее написать, но я попробовал вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
	
             double a =  137661 . 11 ;
	double b =  110781 . 11 ;	
	long money = floor(a - b);
	printf("%d\n",money);
	printf("%d\n",(long)ceil(a - b));
работает так
Код: plaintext
1.
2.
 26879 
 26880 
вообще RTFM - отличный совет, не изобретать велосипед - тож.
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33297097
fixit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denissiofloor тоже не помогает:

Код: plaintext
1.
2.
3.
4.
 double a =  137661 . 11 ;
 double b =  110781 . 11 ;
 int money = floor(a - b);
// money равно 26879 вместо 26880



а так не пробовал? ;)

Код: plaintext
1.
2.
3.
double a =  137661 . 11 ;
double b =  110781 . 11 ;
int money = (int)a - (int)b;
...
Рейтинг: 0 / 0
преобразование типов int, double
    #33297105
fixit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кино "Office space" смотрел?
там чувак такой-же как у тебя код преднамеренно написал и в бухгалтерскую программулину засунул. Я подозреваю, что-то тоже типа ( a - b ). Потом куча бабок у него на счету оказалась. Ту не для бухгалтерии пишешь? :)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / преобразование типов int, double
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]