Преобразование членов данных Object int в плавающую точку и деление добавляет странный поток данных в консоль

0

Я уверен, что я делаю что-то неправильно, но я просто не могу понять. Я создал объект с целыми членами данных, и я хочу, чтобы функция-член возвращала частное от его членов как значение с плавающей запятой, которое оно делает. Затем он добавляет некоторые дополнительные вещи. Результат ниже программы, которая должна работать как есть.

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

class Rational
{
public:
    explicit Rational(int = 0, int = 1);
    double getRationalAsDouble() const;
private:
    int numerator;
    int denominator;
};

Rational::Rational(int numerator, int denominator)
{
    if (denominator == 0)
        this->denominator = 1;
    else
        this->denominator = denominator;
    this->numerator = numerator;
}

// *******  Problem Function *********
double Rational::getRationalAsDouble() const
{
    double a = 0.0, b = 0.0;
    a = static_cast<double>(numerator);
    b = static_cast<double>(denominator);
    cout << endl << "a = " << a;
    cout << endl << "b = " << b;
    cout << endl << "a/b = " << (a/b);
}
// ******** End Problem Function ********

int main()
{

    { //Create a new Scope so that I can view Destructor Message, not used here

        Rational c(2, 6);
        int data = 10;

        cout << c.getRationalAsDouble(); // prints rational object c as double, but not really
        cout << "\n\n";
            } // End of Scope
    return 0;
} // end main

И вот вывод:

a = 2
b = 6
a/b = 0.3333332.31196e-317

Я играю вокруг, и если я изменю функцию, чтобы иметь в ней какое-то регулярное деление, она отлично работает. Что действительно интересно, если я добавляю какой-либо вывод после cout << endl << "a/b =" << (a/b); line, этот вывод обрабатывается до (a/b) части строки. Любая помощь будет принята с благодарностью! Заранее благодарю за ваше время.

Решение: функция ничего не возвращала. Когда код был изменен на:

double Rational::getRationalAsDouble()
{
    return static_cast<double>(numerator)/denominator;
}

Он работал, как ожидалось. Спасибо, тс.

  • 0
    Рекомендуемая ссылка не отвечает на вопрос. Я делю два числа с плавающей запятой и получаю ожидаемое значение с дополнительными значениями мусора в конце. Я должен увидеть a/b = 0.33333332 без добавления к нему .31196e-317 .
Теги:
object
math
output

2 ответа

3
Лучший ответ

Три проблемы:

  • Вы хотите напечатать endl в конце строки, а не "начало". Ваш код заканчивается (эффективно) cout << endl << "a/b = " << (a/b);... cout << c.getRationalAsDouble(); cout << "\n\n"; cout << endl << "a/b = " << (a/b);... cout << c.getRationalAsDouble(); cout << "\n\n"; который печатает два двойных номера 0.333333 и 2.31196e-317 рядом друг с другом без пробелов.
  • Вы хотите (возможно) cout << "\n" << endl вместо cout << "\n\n". endl вызывает endl потока; plain "\n" может и не быть.
  • Rational::getRationalAsDouble() не возвращает значение. Прослушайте предупреждения своего компилятора.

Исправление выглядит примерно так

double Rational::getRationalAsDouble() const
{
  double a = 0.0, b = 0.0;
  a = static_cast<double>(numerator);
  b = static_cast<double>(denominator);
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "a/b = " << (a/b) << endl;
  return a/b;
}
  • 0
    Спасибо! Я не могу поверить, что возвращение было проблемой. Первоначально я реализовал это как cout static_cast<double>(numerator)/denominator; , но, очевидно, проблемы все еще были, потому что ничего не возвращалось. Я использую Dev-C ++, который не греет меня, если я не возвращаю значение. Я постепенно перешел на Visual C ++, который намного лучше, но у меня возникла проблема с этим сегодня, поэтому я просто вернулся к старой бетси. Еще раз спасибо, я ценю ваше время!
  • 0
    Возможно, вам придется включить предупреждение компилятора. Dev-C ++, похоже, компилируется с GCC; Я рекомендую -Wall -Wextra -Wformat=2 -Wno-unused-parameter в качестве отправной точки.
Показать ещё 2 комментария
1

Ваша реализация Rational::getRationalAsDouble() может быть упрощена для:

double Rational::getRationalAsDouble() const
{
   return 1.0*numerator/denominator;
}

Я думаю, что у вас есть все остальное для целей отладки, и, следовательно, на самом деле не нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню