Показать полную графическую версию : деление в c++
sheepang
04-10-2016, 22:09
Double x = 5 / 2;
cout << x;
выводит не 2.5, а 2
что делать, в чем дело, как исправить? помогите плиз
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;
выведет тоже 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
спасиб
Хотя в данном случае правильнее всего обявить x переменной типа double, как я сказал в самом начале. »
Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае.
Ну, может оно по смыслу должно быть как раз-таки integer. Не здесь, так в другом случае. »
Само собой. Если нет возможности сразу объявить как double, можно использовать явное приведение типов:
a = double(x) / 2;
можно использовать явное приведение типов »a = double(x) / 2;Пора уже на static_cast<double>(x) / 2 переходить.
Пора уже на static_cast<double>(x) / 2 переходить. »
Разве это не просто «синтаксическая соль»?
Разве это не просто «синтаксическая соль»? »Не, в 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)).
А практическая ценность - можно отловить часть проблем на этапе компиляции »
Ну приведение int → double, имхо, проблем создать не может. По крайней мере, в подобных случаях.
и само приведение на глаза попадается лучше »
Это и значит «синтаксическая соль».
User001, образно говоря, человек пока учится ходить, так что рассуждения о том, какой звездолёт водить лучше — ему рановаты.
"не в тему"
"Синтаксическая соль" и "синтаксический сахар", это получается разные понятия, да?
Сахар слышал, Соль впервые.
Что у них еще в запасе? :)
Что у них еще в запасе? »
Перец и манка :).
"Синтаксическая соль" и "синтаксический сахар", это получается разные понятия, да?
Сахар слышал, Соль впервые. »
Да, это разные вещи. «Сахар» упрощает синтаксис, делая его более наглядным. Как пример иможно привести оператор array[n] вместо *(array + n).
«Соль» наоборот усложняет синтаксис, делая его громоздким и неудобным. Это нужно для того, чтоб потенциально опасные места сразу бросались в глаза. Вот как явное приведение типов через *_cast.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.