Войти

Показать полную графическую версию : деление в c++


sheepang
04-10-2016, 22:09
Double x = 5 / 2;
cout << x;

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

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

shisik
04-10-2016, 23:19
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
спасибо

а допустим
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
выведет тоже 2 »

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

int x;

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

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

a = x*1.0/2; »

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

a = double(x) / 2;

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

sheepang
05-10-2016, 17:55
спасиб

Iska
05-10-2016, 18:23
Хотя в данном случае правильнее всего обявить x переменной типа double, как я сказал в самом начале. »
Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае.

shisik
05-10-2016, 18:34
Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае. »

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

a = double(x) / 2;

User001
07-10-2016, 17:07
можно использовать явное приведение типов »a = double(x) / 2;Пора уже на static_cast<double>(x) / 2 переходить.

shisik
07-10-2016, 21:58
Пора уже на static_cast<double>(x) / 2 переходить. »

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

User001
08-10-2016, 12:53
Разве это не просто «синтаксическая соль»? »Не, в C++ при C-style cast работает интересней (можно посмотреть сюда (https://habrahabr.ru/post/106294/)). А практическая ценность - можно отловить часть проблем на этапе компиляции и само приведение на глаза попадается лучше (еще пример (http://stackoverflow.com/questions/1609163/what-is-the-difference-between-static-cast-and-c-style-casting)).

shisik
08-10-2016, 13:36
А практическая ценность - можно отловить часть проблем на этапе компиляции »

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

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

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

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

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

Iska
10-10-2016, 00:50
Что у них еще в запасе? »
Перец и манка :).

shisik
10-10-2016, 03:22
"Синтаксическая соль" и "синтаксический сахар", это получается разные понятия, да?
Сахар слышал, Соль впервые. »

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




© OSzone.net 2001-2012