保留三位小数怎么保留(保留三位有效数字举例)

保留小数点后三位的问题在编程中相对常见,但对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就表示保留三位小数,四舍五入等亲测有效!

发表评论

登录后才能评论