Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранить количество нулей, При операциях с двумя числами 
V
    Опции темы
Voldemar2004
  Дата 30.11.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Как сохранить количество нулей при операциях с двумя числами:

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

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


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Earnest
Дата 30.11.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
Voldemar2004
  Дата 30.11.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Код
#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
Это я знаю, в моем случае неудобно. Скорее всего удобнее будет написать свою функцию, сохраняющую нули.



--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
Voldemar2004
  Дата 30.11.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



Придумал:

Код


// Функция добавляет нули к числу (числа только целые):
// например: 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();

}




--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
xvr
Дата 30.11.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Для С (равно как и для С++) 10.0, 10.00, 10.000 и 10.000 одно и тоже, причем прямо на этапе компиляции. Так что сложно сохранить то, чего нет  smile 
PM MAIL   Вверх
Voldemar2004
  Дата 30.11.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1650
Регистрация: 25.12.2004

Репутация: нет
Всего: 23



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


--------------------
i_i 
(';') 
(V)

user posted image
PM MAIL   Вверх
xvr
Дата 30.11.2009, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(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) и операторы присваивания. Далее делается арифметика.
И все - получаем нужный тип данных

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.