@Sergey_Dultsev

Как преобразовывать тип данных?

почему у меня не преобразовывается переменная из int в float?
Код
#include <iostream>

using namespace std;

class Math
{
    public:
    int a,b;
    void subtraction(){
        int sub = a - b;
        cout << sub;
    }
    void addition(){
        int add = a + b;
        cout << add;
    }
    void multiplication(){
        int mul = a * b;
        cout << mul;
    }
    void division(){
        int divi = static_cast <float> (a) / b;
        if(b != 0){
            cout << divi;
        }
    }
};



int main()
{
    Math kalrulator;
    cout<<"Введите а:";
    cin >> kalrulator.a;
    cout<<"Введите b:";
    cin >> kalrulator.b;
    cout<<"Вычитание:";
    kalrulator.subtraction();
    cout<<endl;
    cout<<"Сложение:";
    kalrulator.addition();
    cout<<endl;
    cout<<"Умножение:";
    kalrulator.multiplication();
    cout<<endl;
    cout<<"Деление:";
    kalrulator.division();
    cout<<endl;
    return 0;
}
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
Qubc
@Qubc
Ненавижу полисемию.
int divi = static_cast<float>(a) / b;
a явно приводится к float, b неявно приводится к float, результат помещается во временный объектс типом float, временный объектнеявно преобразуется в intи сохраняется в divi.
Исходный код желательно писать в теле вопроса и очищать его от постороннего кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Ремарка по поводу этого кода.
void division(){
        int divi = static_cast <float> (a) / b;
        if(b != 0){
            cout << divi;
        }
    }

В расчетах с floating point результат деления 0.0/0 вполне себе определен. Это неопределенность (NaN) и она вполне себе легальна в домене вещественных чисел. Или бесконечность разных знаков (Inf) если только знаменатель равен нулю. По неясным причинам автор отвергает этот результат.
Более того в ответе будет напечатано

cout<<"Деление:";

и тишина. Неясно отработал метод или нет. Это дефект приложения.

Как бороть такую проблему. В целых числах - никак. Нет легального способа. Я обычно делаю Optional
std::optional<int> safe_div(int x, int y) {
   .....
}

Опционал - это коробочка в которой либо лежит число либо не лежит. Вызывающая сторона соотв
обязана исполнить протокол вскрытия этой коробочки. Проверить что она непустая.

Или можно попробовать монаду Either где можно указать причину ошибки.
Не знаю есть ли это в С++ но должно быть. Во всех нормальных языках должно быть.

Float/Double - это коварные типы данных. Они доставляют немало хлопот для bigdata. И с ними надо быть
аккуратными. Главное правило - кастинг из floating point в целые числа в общем случае не работает. Нужно
думать над отработой исключений всегда. Тоже самое касается диапазонов. Они коварны. И можно терять
занчимые разраяды на конверсиях. Ответственность за эти действия ВСЕГДА лежит на программисте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы