`cout<<int(a)`?
by zhy137036 @ 2020-04-02 10:16:00
```cout<<int(a)<<endl;```
by liqingyang @ 2020-04-02 10:16:42
好像少了一个分号
by zhy137036 @ 2020-04-02 10:16:49
@[zhy137036](/user/178294) 我需要保存有效的小数
by Miller2019 @ 2020-04-02 10:17:26
比如 3.141500000000 变成 3.1415
by Miller2019 @ 2020-04-02 10:18:02
@[Miller2019](/user/256340)
```cpp
#include<bits/stdc++.h>
using namespace std;
struct pnum
{
int flen,blen,fnt[20000],bct[20000];
void read()
{
memset(fnt,0,sizeof(fnt));memset(bct,0,sizeof(bct));
string s;
cin>>s;
flen=0,blen=0;
int i,p=s.find(".");
if(p==string::npos)
{
for(i=s.size()-1;i>=0;i--) fnt[s.size()-1-i]=s[i]-'0',flen++;
return;
}
for(i=s.size()-1;s[i]!='.';i--) bct[s.size()-1-i]=s[i]-'0',blen++;
i--;int g=i;
for(;i>=0;i--) fnt[g-i]=s[i]-'0',flen++;
conver();
return;
}
void conver()
{
if(blen>1)
for(int i=0;i<blen&&bct[i]==0;blen--)
for(int j=i;j<blen-1;j++)
bct[j]=bct[j+1];
if(flen>1)
for(int i=flen-1;i>=0 && flen>1 && flen>i && fnt[i]==0;i--) flen--;
return;
}
void print()
{
conver();
for(int i=flen-1;i>=0;i--) printf("%d",fnt[i]);
if(blen) printf(".");
for(int i=blen-1;i>=0;i--) printf("%d",bct[i]);
return;
}
pnum operator+(pnum b)
{
pnum ans;memset(ans.fnt,0,sizeof(ans.fnt));memset(ans.bct,0,sizeof(ans.bct));ans.flen=max(flen,b.flen);ans.blen=max(blen,b.blen);
if(blen<b.blen)
for(int i=blen;i<b.blen;i++)
{
for(int j=blen;j>0;j--)
bct[j]=bct[j-1];
blen++;
bct[0]=0;
}
else
for(int i=b.blen;i<blen;i++)
{
for(int j=b.blen;j>0;j--)
b.bct[j]=b.bct[j-1];
b.blen++;
b.bct[0]=0;
}
for(int i=0;i<max(blen,b.blen);i++)
ans.bct[i]+=bct[i]+b.bct[i],ans.bct[i+1]+=ans.bct[i]/10,ans.bct[i]%=10/*,printf("%d\n",ans.bct[i])*/;
if(ans.bct[max(blen,b.blen)]>=0) ans.fnt[0]+=ans.bct[max(blen,b.blen)],ans.bct[max(blen,b.blen)]=0;
for(int i=0;i<max(flen,b.flen);i++)
ans.fnt[i]+=fnt[i]+b.fnt[i],ans.fnt[i+1]+=ans.fnt[i]/10,ans.fnt[i]%=10/*,printf("%d\n",ans.fnt[i])*/;
if(ans.fnt[max(flen,b.flen)]>0) ans.flen++;
return ans;
}
pnum operator*(pnum b)
{
pnum ans;
memset(ans.fnt,0,sizeof(ans.fnt));memset(ans.bct,0,sizeof(ans.bct));
int p1[20000],p2[20000],p3[40000],p1len,p2len,p3len;
memset(p1,0,sizeof(p1));memset(p2,0,sizeof(p2));memset(p3,0,sizeof(p3));
p1len=flen+blen;p2len=b.flen+b.blen;
for(int i=0;i<blen;i++) p1[i+1]=bct[i];
for(int i=0;i<flen;i++) p1[i+blen+1]=fnt[i];
for(int i=0;i<b.blen;i++) p2[i+1]=b.bct[i];
for(int i=0;i<b.flen;i++) p2[i+b.blen+1]=b.fnt[i];
for(int i=1;i<=p1len;i++)
for(int j=1;j<=p2len;j++)
p3[i+j-1]+=p1[i]*p2[j];
for(int i=1;i<=p1len+p2len;i++)
p3[i+1]+=p3[i]/10,p3[i]%=10;
if(p3[p1len+p2len]>0) p3len=p1len+p2len;
else p3len=p1len+p2len-1;
ans.blen=blen+b.blen;ans.flen=p3len-ans.blen;
for(int i=blen+b.blen+1;i<=p3len;i++)
ans.fnt[i-blen-b.blen-1]=p3[i];
for(int i=1;i<=blen+b.blen;i++)
ans.bct[i-1]=p3[i];
return ans;
}
pnum operator/(int b)
{
pnum ans;
memset(ans.fnt,0,sizeof(ans.fnt));memset(ans.bct,0,sizeof(ans.bct));
int p1[20000],p1len=blen+flen;
memset(p1,0,sizeof(p1));
for(int i=0;i<blen;i++) p1[i+1]=bct[i];
for(int i=0;i<flen;i++) p1[i+blen+1]=fnt[i];
if(p1[1]%b!=0)
{
for(int i=p1len+1;i>1;i--) p1[i]=p1[i-1];
p1[1]=0;
p1len++;
}
ans.blen=p1len-flen;ans.flen=flen;
for(int i=p1len;i>=2;i--)
p1[i-1]+=(p1[i]%b)*10,p1[i]/=b;
p1[1]/=b;
for(int i=1;i<=ans.blen;i++) ans.bct[i-1]=p1[i];
for(int i=ans.blen+1;i<=p1len;i++) ans.fnt[i-ans.blen-1]=p1[i];
ans.conver();
return ans;
}
bool operator<(pnum b)const
{
b.conver();
if(flen!=b.flen) return flen<b.flen;
for(int i=flen-1;i>=0;i--)
if(fnt[i]!=b.fnt[i]) return fnt[i]<b.fnt[i];
for(int i=min(blen,b.blen)-1;i>=0;i--)
if(bct[i]!=b.bct[i]) return bct[i]<b.bct[i];
return false;
}
}n;
int main()
{
n.read();
n.conver();
n.print();
return 0;
}
```
by jwcub @ 2020-04-02 10:19:25
@[Miller2019](/user/256340) 用 `sprintf` 输出足够多(比如 $30+$)位小数,然后手动把末尾的 $0$ 去掉?
by zhanghengrui @ 2020-04-02 10:21:23
@[kevinhou](/user/75437) 谢谢,%%%
by Miller2019 @ 2020-04-02 10:21:41
@[zhanghengrui](/user/110634) sprintf 不会...
by Miller2019 @ 2020-04-02 10:22:55
@[Miller2019](/user/256340)
``` cpp
double c;
cin>>c;
printf("%.4lf", (double)((int)(c*10000))/10000);
```
by __Watcher @ 2020-04-02 10:23:04