求助:如何忽略浮点小数末尾0(C++)

学术版

`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


| 下一页