Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   деление в c++ (http://forum.oszone.net/showthread.php?t=319450)

sheepang 04-10-2016 22:09 2675117

деление в c++
 
Double x = 5 / 2;
cout << x;

выводит не 2.5, а 2

что делать, в чем дело, как исправить? помогите плиз

shisik 04-10-2016 23:19 2675143

Код:

double x = 5.0 / 2;
Дело в том, что компилятор воспринимает 5 как целое число int, делит его на другое целое число и получается результат - тоже целое число. И только потом он приводится к типу double:

Код:

double x = double(5 / 2);
Как-то так получается. Для деления с сохранением дробной части нужно 5 привести к типу double до операции деления:

Код:

double x = double(5) / 2;
Или же просто определить в виде дробного числа, как я показал в самом начале.

sheepang 05-10-2016 13:55 2675290

спасибо

а допустим
int x;
double a;
cin >> x; вводится 5
a = x/2;
cout << a;


выведет тоже 2, а надо 2.5! как быть?

все!!! понял!!!

a = x*1.0/2;

shisik 05-10-2016 15:45 2675335

Цитата:

Цитата sheepang
выведет тоже 2 »

Ну конечно! Вы же объявили x целым числом int:

Код:

int x;
Объявите его double и всё:

Код:

double x;
double a;
cin >> x; //вводится 5
a = x/2;
cout << a;

Цитата:

Цитата sheepang
a = x*1.0/2; »

Это будет работать, но это называется «костыль». Тогда уж правильнее явно привести к double:

Код:

a = double(x) / 2;
Хотя в данном случае правильнее всего обявить x переменной типа double, как я сказал в самом начале.

sheepang 05-10-2016 17:55 2675364

спасиб

Iska 05-10-2016 18:23 2675375

Цитата:

Цитата shisik
Хотя в данном случае правильнее всего обявить x переменной типа double, как я сказал в самом начале. »

Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае.

shisik 05-10-2016 18:34 2675377

Цитата:

Цитата Iska
Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае. »

Само собой. Если нет возможности сразу объявить как double, можно использовать явное приведение типов:

Код:

a = double(x) / 2;

User001 07-10-2016 17:07 2675963

Цитата:

Цитата shisik
можно использовать явное приведение типов »
Код:

a = double(x) / 2;

Пора уже на static_cast<double>(x) / 2 переходить.

shisik 07-10-2016 21:58 2676042

Цитата:

Цитата User001
Пора уже на static_cast<double>(x) / 2 переходить. »

Разве это не просто «синтаксическая соль»?

User001 08-10-2016 12:53 2676103

Цитата:

Цитата shisik
Разве это не просто «синтаксическая соль»? »

Не, в C++ при C-style cast работает интересней (можно посмотреть сюда). А практическая ценность - можно отловить часть проблем на этапе компиляции и само приведение на глаза попадается лучше (еще пример).

shisik 08-10-2016 13:36 2676109

Цитата:

Цитата User001
А практическая ценность - можно отловить часть проблем на этапе компиляции »

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

Цитата:

Цитата User001
и само приведение на глаза попадается лучше »

Это и значит «синтаксическая соль».

Iska 08-10-2016 17:10 2676147

User001, образно говоря, человек пока учится ходить, так что рассуждения о том, какой звездолёт водить лучше — ему рановаты.

lxa85 10-10-2016 00:34 2676477

"не в тему"
"Синтаксическая соль" и "синтаксический сахар", это получается разные понятия, да?
Сахар слышал, Соль впервые.
Что у них еще в запасе? :)

Iska 10-10-2016 00:50 2676479

Цитата:

Цитата lxa85
Что у них еще в запасе? »

Перец и манка :).

shisik 10-10-2016 03:22 2676495

Цитата:

Цитата lxa85
"Синтаксическая соль" и "синтаксический сахар", это получается разные понятия, да?
Сахар слышал, Соль впервые. »

Да, это разные вещи. «Сахар» упрощает синтаксис, делая его более наглядным. Как пример иможно привести оператор array[n] вместо *(array + n).
«Соль» наоборот усложняет синтаксис, делая его громоздким и неудобным. Это нужно для того, чтоб потенциально опасные места сразу бросались в глаза. Вот как явное приведение типов через *_cast.


Время: 10:09.

Время: 10:09.
© OSzone.net 2001-