保留小数点后三位的问题在编程中相对常见,但对C 萌新而言,是个很头疼的问题-_-,如果不用函数的话,编程量相对来说较大。
A.错误方法
我先来介绍一种错误方法:如图所示:(代码摘自百度)
保留三位小数,现在小数点后四位加5,然后乘1000将小数点→移3位。再用强制类型转换为int 把小数点后的数据砍掉,最后强制转换回来并除以一千。代码摘自百度,看似没有错的逻辑,我们编译一次试试。
由于程序最后一步除1000,未在右侧补0,所以一旦最后一位为0时,无法保留三位小数,所以百度推荐的方法,是错的!
B要背单词的方法
在拥有头文件#include <iomanip>条件下。
让setprecision(n)与setiosflags(ios:fixed)合用,可以控制小数点右边的数字个数
如图所示:
经试验,程序有效,但是需要记忆两个超长的单词。。。
C纯代码
话不多说,先发代码
代码是我自己写的,思路好像或许有一些奇怪,总之就是想办法把小数点前后分离,然后手动打上小数点,我们运行一下程序,和上一个方法对比,看看这个程序有什么漏洞。
可见,数字位数变大,我的方法就不适用了。究其原因,是因为在y=int((s 0.0005)*1000);
我们将程序改进一下:
完整程序:
#include<iostream>
#include <iomanip>
//#include <windows.h>
using namespace std;
int main(){
double s,s1;
int m,n,y;
while(cin>>s){
s1=s;
int u=0;
while(s1>100000){
s1=s1-100000;
u ;
}
y=int((s1 0.0005)*1000); //用强制转化成一个整数
n= y00;
m= (y-n)/1000; //将小数点前后分离为 m,n
while(u){
m=m 100000;
u–;
}
cout<<“按我的方法保留三位小数:”;
if(n<10) cout<<m<<“.00″<<n<<endl;
if(n<100&&n>9) cout<<m<<“.0″<<n<<endl;//讨论小数点后(n)的情况,
if (n>99) cout<<m<<“.”<<n<<endl; //手动补小数点和零
cout<<“按第二个方法保留三位小数:”;
cout<<setiosflags(ios::fixed);
cout<<setprecision(3)<<s<<endl;
}
return 0;
}
如果数字大于十万,便将它减去十万并记录减去的次数,用 上述方法处理完毕后,再在整数部分加上曾经减去的次数*十万,确保在处理时数据不会过大溢出。
灵感来自比尔盖茨的汇编语言处理AX(16位)加减法的方法。
D最简便的方法
C 程序员很少用printf,多用cout,但是要求输出格式,比如保留三位小数的时候,还是printf最简便哦,%.3f. 3就表示保留三位小数,四舍五入等亲测有效!