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


Автор: Rino 1.10.2005, 19:06
Народ, подскажите плиз, как вывести 0,80 как 0,08, в С/С++, помню что как-то пишеться i чего-то там и цифарки, но не помню как именно, а MSDN не стоит, диски отдал.
Заранее спасибо, сорри за глупый вопрос.

Автор: Mayk 1.10.2005, 20:32
Цитата(Rino @ 1.10.2005, 23:06)
Народ, подскажите плиз, как вывести 0,80 как 0,08,

Раздели на 10 smile

Ну а кол-во знаков задавать например так
Код

printf("%.2f",0.08);


Автор: nikitao 2.10.2005, 01:09
Цитата
Ну а кол-во знаков задавать например так

Или(если в С++) через манипулятор:
Код

#include<iomanip.h>
//бла бла бла
cout<<setprecision(i)<<d; //i-точность которая тебенужна d-твое число

или так:
Код

cout.precision(i);

Автор: Zero 2.10.2005, 11:34
Цитата(Rino @ 1.10.2005, 19:06)
как вывести 0,80 как 0,08, в С/С++

Точнее сказать "форматирование чисел с дробной частью":
Код

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(<количество знаков после десятичной точки>);

Автор: Rino 2.10.2005, 17:38
nikitao
Спасибо, только че-то не очень компилиться. Я немного не то написал, просто задание на работу с числами, и в итоге мне надо int 80 вывести на экран как 0.08 используя какой-то там формат вывода, ну "0." я просто печатаю, а вот дальше нужен какой-то формат вывода

Автор: Dreamer_0x01 2.10.2005, 17:49
не понимаю вашего задания. еще раз кратко и в деталях.

Автор: Rino 2.10.2005, 20:40
см прикрепленный файл. В конструкторе я получаю мантиссу(для удобства * на 1000) и exp, потом написаны операции сложения, умножения и вычитания для чисел моего класса. Все нормально работает, вот только с умножением, при определенных значениях(хочу получить 0,08) получается 80, все как надо(если поделить на 1000, то как раз 0,08), только на экран это выводиться
cout <<"0." << mant << " * 10^" <<exp << "\n";
как все и должно выводиться
0.80 * 10^0
а мне надо 0.08 * 10^0
препод сказал, что есть какой-то формат вывода, но он не помнит, типо посмотри сам.
Надеюсь понятно? кто-нить может помочь?

Автор: Zero 2.10.2005, 21:45
Цитата(Rino @ 2.10.2005, 20:40)
препод сказал, что есть какой-то формат вывода, но он не помнит, типо посмотри сам.
Надеюсь понятно? кто-нить может помочь?

Слуш, чувак, я же в предыдущем всвоём посте написал тебе формат вывода чисел с дробной частью
Добавлено @ 21:52
Упс... Извиняюсь, с отрицательными числами этот способ не подходит.. smile

Автор: nikitao 2.10.2005, 21:59
До меня теперь вообще ничего не доходит??????? smile
Может весь исходный код или часть(которая не работает) выложешь,а то не понятно,что значит
Цитата
Все нормально работает, вот только с умножением, при определенных значениях

При каких работает ,а при каких нет?

Автор: Rino 2.10.2005, 23:20
может так будет понятно

//конструктор

myclass::myclass(double x)
{
bool znak;
int count = 0;

exp = 0;

if (x < 0)
{
x = -x;
znak = true;
}

if (x < 10e-8)
x = 0;
else
{
while (x<=0.1)
{
x *= 2;
count++;

exp = -count;
}

}
while (x>1)
{
x /=2;
count++;

exp = count;
}


x *= 1000;
mant = x;
if (znak == true)
mant = -mant;


}

////****************************************
//оператор умножения

myclass operator*(myclass x, myclass y)
{
myclass rez(0);

rez.mant = y.mant * x.mant/1000;
rez.exp = y.exp + x.exp;

return rez;
}

//вывод

void myclass ::print()

{
if (mant < 0)
cout <<"-0." << -mant << " * 10^" <<exp << "\n";

else
cout <<" 0." << mant << " * 10^" <<exp << "\n";

}


//tets programme

#include "myclass.h"
#include <iostream>
using namespace std;

void main(void)
{
myclass a1(4), a2(0.02), rez(0);


a1.print();
a2.print();
rez = a1*a2;
cout <<"a1 * a2 = ";
rez.print();
getchar();
}

//my class

class myclass
{
int mant;
int exp;
public:

myclass(double x);
void print();
myclass(int x, int y);


//friend myclass operator+(myclass, myclass);
//friend myclass operator-(myclass, myclass);
friend myclass operator*(myclass, myclass);


};

вот, при все таком стечении обстоятельств выводиться 0,80*10^0
а мне надо 0,080 * 10^0
как я уже писал препод сказал, типо есть какой-то формат вывода,

Автор: BreakPointMAN 3.10.2005, 00:17
бред какой-то, ты уж извини... но когда программа написана в таком стиле и с ошибками в алгоритме, тема звучит еще более бредово... мде... я бы вообще заново все это переписал ))

а пока - попробуй заменить
Код

myclass operator*(myclass x, myclass y)
   {
    myclass rez(0);
    rez.mant = y.mant * x.mant/1000;
    rez.exp = y.exp + x.exp;
    return rez;
}

на
Код

myclass operator*(myclass x, myclass y)
   {
    myclass rez((y.mant*pow(10,y.exp))/1000 * ((x.mant*pow(10, x.exp))/1000));
    return rez;
   }

Автор: Rino 3.10.2005, 00:58
Я не обидчивый и люблю когда меня поправляет, так как хочу научиться писать все нормально, то что программу можно переписать я знаю, сейчас работаю над этим, просто выложил работающий вариант.
а насче
Цитата


myclass operator*(myclass x, myclass y)
  {
    myclass rez((y.mant*pow(10,y.exp))/1000 * ((x.mant*pow(10, x.exp))/1000));
    return rez;
  }


нельзя юзать по заданию pow и вообще использовать плавающую арифметику.
это умножение не будет корректно работать с моими числами.
а с выводом я кажеться разобрался, вроде так все пашет корекктно

if (mant<0) {mant=-mant;
printf("-%.3f=(-0.%d*2^%d)\n",mant*pow(2,exp)/1000,mant,exp);}
else
printf("%.3f=(0.%d*2^%d)\n",mant*pow(2,exp)/1000,mant,exp);
BreakPointMAN напиши плиз, что вообще можно подправить буду благодарен

Автор: kilonet 28.10.2007, 00:03
Похожий вопрос:
делаю вывод чисел с помощью sprintf.
Как удалить лишние незначащие нули в конце массиве байтов:
"25.500000" -> "25.5"
"25.560000" -> "25.56"
Как непосредственно их удалить из массива в принципе понятно. Может можно строку форматирования как-то написать или функцию другую использовать или ещё что-то... чтобы само собой всё получалось

Автор: JackYF 28.10.2007, 01:19
kilonet, из строки удалять нули? Это к форматированию уже отношения не имеет, (s)printf про строки ничего не знает.

Автор: Ln78 28.10.2007, 05:42
kilonet, %g (%lg) отличаются от %f (%lf) как раз тем, что удаляют незначащие нули.

Автор: Dronchik 28.10.2007, 10:43
Rino, для лучшего вида поста с кодом есть такая кнопочка, код называеться. Кней мышку подводишь и выбираешь подсветку какого кода тебе надо

Автор: archimed7592 28.10.2007, 10:48
Цитата(Rino @  2.10.2005,  20:40 Найти цитируемый пост)
cout <<"0." << mant << " * 10^" <<exp << "\n";
как все и должно выводиться
0.80 * 10^0
а мне надо 0.08 * 10^0

А общепризнанная научная форма вывода не устроит? mantE+/-exp... 1.23e-2 == 0.0123

Автор: JackYF 28.10.2007, 11:53
Ln78,
Цитата(kilonet @  28.10.2007,  00:03 Найти цитируемый пост)
в конце массиве байтов



Автор: Ln78 28.10.2007, 12:14
JackYF
Цитата(kilonet @  28.10.2007,  00:03 Найти цитируемый пост)
делаю вывод чисел с помощью sprintf

Массив уже в итоге smile 

archimed7592, ты думаешь для топик-стартера тема всё ещё актуальна? smile 

Автор: archimed7592 28.10.2007, 17:28
Цитата(Ln78 @  28.10.2007,  12:14 Найти цитируемый пост)
archimed7592, ты думаешь для топик-стартера тема всё ещё актуальна? smile 

Я как-то внимания на даты не обратил smile.
Некрофилы, блин...

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