Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по сишным округлениям и типу char, дробную в i , целую в u  
:(
    Опции темы
001dark
Дата 17.4.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Код

char s;
int i,u=0,res,num;
float d=0;
scanf("%f",&d);

i=d; // таким  образом я засовываю целую   
u=(d-i)*100 // засовываю дробную    :)

printf("%d,  %d",i,u);

ввожу 11.11
выдает 11.00 
с какого так ?  smile   (как делать что бы не округлял)             --- это первый вопрос.

как сделать так что бы scanf брал  не больше трех символов в целой части и двух в дробной 
запихивалось это в переменную типа CHAR --- второй вопрос   smile    



PM MAIL ICQ   Вверх
Voldemar2004
Дата 17.4.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



001dark, а тебе не кажется, что 
Код
u
 у тебя всегда будет равно нулю.

Код
scanf("%f",&d); // считал в d

i=d; // присвоил i значение d
u=(d-i)*100; // вычел из d значение i, которое опять же равно d !



res, num где у тебя используется ?

Цитата(001dark @  17.4.2007,  23:41 Найти цитируемый пост)
не больше трех символов в целой части и двух в дробной запихивалось
Цитата
In ...scanf format strings, format specifiers have the following form:

% [*] [width] [F|N] [h|l|L] type_char

Each format specifier begins with the percent character (%).

After the % come the following, in this order:

Component  Optional/Required    What It Is/Does

[*]    (Optional)  Assignment-suppression character. Suppresses assignment of the next input field.
[width]    (Optional)  Width specifier. Specifies maximum number of characters to read; fewer characters might be read if the ...scanf function encounters  a whitespace or unconvertible character.

[F|N]    (Optional)  Pointer size modifier. Overrides default size of address argument:

N    =  near pointer

F    =  far pointer

[h|l|L]    (Optional)  Argument-type modifier. Overrides default type of address argument:

h    =    short int
l    =    long int, if type_char specifies integer conversion

l    =    double, if type_char specifies floating-point conversion

L    =    long double, (valid only with floating-point conversion)

type_char    (Required)    Type character

Цитата(001dark @  17.4.2007,  23:41 Найти цитируемый пост)
запихивалось это в переменную типа CHAR
Код
char* Value;
 и strcpy ()



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
nickless
Дата 17.4.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Voldemar2004 @  17.4.2007,  21:58 Найти цитируемый пост)
вычел из d значение i, которое опять же равно d !

Но d это float, а i - int smile

001dark, а ты вводил 11,11 или 11.11 ? А то может дробная часть вообще не считалась...
А код твой у меня работает. Почти. Выводит 11,10 , потому что 11.11 не может быть точно представлено в двоичном виде, так что в d может быть что-то вроде 11.109999999999999.

Для чего тебе нужна дробная часть? Если просто для вывода, то лучше использовать форматирование, если для вычислений, то лучше используй округление round()


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
zkv
Дата 17.4.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Voldemar2004 @  17.4.2007,  22:58 Найти цитируемый пост)
у тебя всегда будет равно нулю.

неа, в нормальном компиляторе должно работать (возможно результат не тот что ожидаешь получишь только  smile ),
 дело происходит так:
u=(d-i)*100
1. i преобразовывается к float
2. считается разность, тип - флоат
3. 100 преобразовывается к флоат
4. считается произведение, тип - флоат
5. произведение из флоат преобразовывается к инт, результат присваивается u

001dark, попробуй нагло все к float привести: (float)i

Цитата(001dark @  17.4.2007,  22:41 Найти цитируемый пост)
как сделать так что бы scanf брал  не больше трех символов в целой части и двух в дробной 
запихивалось это в переменную типа CHAR

 smile в char столько не влезет

PM MAIL   Вверх
001dark
Дата 17.4.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



не будет u всегда равно 0 (я опечатался выдает 11.10  вместо 11.11 )  ,он его округляет почему так 




res,num  используются дальше они нам не важны

Это сообщение отредактировал(а) 001dark - 17.4.2007, 23:10
PM MAIL ICQ   Вверх
Voldemar2004
Дата 17.4.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Цитата(001dark @  18.4.2007,  00:09 Найти цитируемый пост)
не будет u всегда равно 0
Пардон, да не будет, если вводить дробное число. Я вводил целое. smile 



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
001dark
Дата 17.4.2007, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 13.3.2007

Репутация: нет
Всего: нет



Цитата

 а ты вводил 11,11 или 11.11 ? А то может дробная часть вообще не считалась...
А код твой у меня работает. Почти. Выводит 11,10 , потому что 11.11 не может быть точно представлено в двоичном виде, так что в d может быть что-то вроде 11.109999999999999.
 у меня так же  smile . почему Си выдает так ... сволоч  
PM MAIL ICQ   Вверх
nickless
Дата 17.4.2007, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(001dark @  17.4.2007,  22:09 Найти цитируемый пост)
он его округляет почему так

Я ж говорю, в d не 11.11, a примерно 11.10999999999999, а ты просто отбрасываешь все цифры после второй, а надо округлять.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
zkv
Дата 17.4.2007, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



001dark, 
пишем:
Код

    float d = 0.;
    scanf("%f",&d);

    int i=d; 
    printf("\ni == %d", i );

    float f = d-i;
    printf("\nf == %f",f );

    f *= 100; 
    printf("\nf*100 == %f", f );

    int u = f; 
    printf("\nu == %d", u );

Цитата(Вывод на экран)

11.11

i == 11
f == 0.110000
f*100 == 10.999966
u == 10

ясно?
PM MAIL   Вверх
nickless
Дата 17.4.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(001dark @  17.4.2007,  22:18 Найти цитируемый пост)
почему Си выдает так ...

Это не С, это процессор виноват smile 
Где-то тут недавно была такая тема про округления... А, вот она, почитай, там всё написано


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
betal
Дата 18.4.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



Цитата(001dark @  17.4.2007,  22:41 Найти цитируемый пост)

как сделать так что бы scanf брал  не больше трех символов в целой части и двух в дробной 
  

%.2f
Цитата(Voldemar2004 @  17.4.2007,  22:58 Найти цитируемый пост)
Выделить всёкод C++
1:
    
u
 у тебя всегда будет равно нулю.

 smile

Добавлено через 3 минуты и 28 секунд
Цитата(nickless @  17.4.2007,  23:07 Найти цитируемый пост)
Но d это float, а i - int smile

001dark, а ты вводил 11,11 или 11.11 ? А то может дробная часть вообще не считалась...
А код твой у меня работает. Почти. Выводит 11,10 , потому что 11.11 не может быть точно представлено в двоичном виде, так что в d может быть что-то вроде 11.109999999999999.

Для чего тебе нужна дробная часть? Если просто для вывода, то лучше использовать форматирование, если для вычислений, то лучше используй округление round() 

Точно. Может попробывать int -> float а потом уже проводить вычитания. Или на конец после числа int ставить "."
Если я ничего не путаю то вродебы так преаброзовывать 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0632 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.