Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сохранить количество нулей


Автор: Voldemar2004 30.11.2009, 09:59
Как сохранить количество нулей при операциях с двумя числами:

например: 20.0000 + 100.001000 = 120.001000

Есть готовая функция ?

Автор: Earnest 30.11.2009, 10:02
Где сократить число нулей? При форматировании в строку? Да, есть: %g для printf. Правда, при длинной мантиссе может перейти к научной нотации, так что, если это нежелательно, лучше написать свою ф-ю для убирания правых нулей, тем более, что это тривиально.

Автор: Voldemar2004 30.11.2009, 10:05
Код
#include <iomanip.h>
#include <iostream.h>

//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{

cout << setprecision(20) << 10.000000;

cin.get();

return 0;
}
//---------------------------------------------------------------------------


Нули не сохраняет. 

Велосипед изобретать не хочется  smile

Добавлено через 4 минуты и 59 секунд
Цитата(Earnest @  30.11.2009,  11:02 Найти цитируемый пост)
Где сократить число нулей?
Я говорил не о сокращении количества нулей: 

Цитата(Voldemar2004 @  30.11.2009,  10:59 Найти цитируемый пост)
Как сохранить количество нулей


20.0000 + 100.001000 выводит 120.001, требуется 120.001000

Добавлено через 6 минут и 28 секунд
Цитата(Earnest @  30.11.2009,  11:02 Найти цитируемый пост)
при длинной мантиссе может перейти к научной нотации
Экспоненциальной форме ?

Цитата(Earnest @  30.11.2009,  11:02 Найти цитируемый пост)
 %g для printf
Это я знаю, в моем случае неудобно. Скорее всего удобнее будет написать свою функцию, сохраняющую нули.

Автор: Voldemar2004 30.11.2009, 16:37
Придумал:

Код


// Функция добавляет нули к числу (числа только целые):
// например: 1323.00000 + 10.00 = 1333.00000

// первый аргумент - результат вычисления другой функцией 
// второй аргумент - параметр a
// третий аргумент - параметр b

#include <iostream.h>

using namespace std;

string AddNull(string Number, string a, string b);

//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{

cout << AddNull("-1333.0", "-1323", "-10.000");

cin.get();

return 0;
}
//---------------------------------------------------------------------------

string AddNull(string Number, string a, string b) {

        string buffer;

        string buf;

        if( a [ strlen(a.c_str())-1 ] == '0' || b [ strlen(b.c_str())-1 ] == '0' || a [ strlen(b.c_str())-1 ] == '.' || b [ strlen(b.c_str())-1 ] == '.') {

        int position;
        for(int i=0; i<strlen(a.c_str())-1; i++) {

                if(a[i] == '.') {
                position = i;
                break;
                }
        }

        int count1=0;

        for(int i=position; i<strlen(a.c_str()); i++) count1++;

        count1--;

        for(int i=0; i<strlen(b.c_str())-1; i++) {

                if(b[i] == '.') {
                position = i;
                break;
                }
        }

        int count2=0;

        for(int i=position; i<strlen(b.c_str()); i++) count2++;

        count2--;

        if(count1 > count2) {
                for(int i=0; i<count1; i++) {
                buffer += '0';
                }
        }

        else {
                for(int i=0; i<count2; i++) {
                buffer += '0';
                }
        };


        for(int i=0; i<strlen(Number.c_str()); i++) {
                if(Number[i]!='.') { buf += Number[i]; }
                else break;
        }

        buf += '.';
        buf += buffer.c_str();

        }

return buf.c_str();

}


Автор: xvr 30.11.2009, 16:42
Для С (равно как и для С++) 10.0, 10.00, 10.000 и 10.000 одно и тоже, причем прямо на этапе компиляции. Так что сложно сохранить то, чего нет  smile 

Автор: Voldemar2004 30.11.2009, 22:10
Цитата(xvr @  30.11.2009,  17:42 Найти цитируемый пост)
Для С (равно как и для С++) 10.0, 10.00, 10.000 и 10.000 одно и тоже
А это и не только для C++ , а вообще для математики так ! Просто потребовалось такая задача smile 

Автор: xvr 30.11.2009, 23:29
Цитата(Voldemar2004 @ 30.11.2009,  22:10)
Цитата(xvr @  30.11.2009,  17:42 Найти цитируемый пост)
Для С (равно как и для С++) 10.0, 10.00, 10.000 и 10.000 одно и тоже
А это и не только для C++ , а вообще для математики так ! Просто потребовалось такая задача smile

Угу, а это значит, что это нельзя представить в виде встроенного float(double). Т.е. нужен специализированный класс. Твой вариант не самый лучший  smile 
Лучше сделать класс, хранящий целую и дробную часть в виде целых чисел и длинны (можно для обоих частей, для целой и дробной)
Код

class FullNumber {
 int integral_part, frac_part;
 int integral_len, frac_len;
public:

 friend ostream& operator<<(ostream& s, const FullNumber&)
  {
    ios_base::fmtflags sv=s.flags();
    ios_base::streamsize wdt=s.width();
    s.width(integral_len); s<<right<<dec<<integral_part<<'.';
    s.width(frac_len); s<<frac_part;
    s.setf(sv);
    return s;
  }
};

Далее делаются конструктор (из int,double и string) и операторы присваивания. Далее делается арифметика.
И все - получаем нужный тип данных

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)