加数乘积求商取舍法
基本原理阐释
任取一个数,以我的生日为蓝本取1998.1120,可以发现这是一个四位小数(保留0),假如要保留三位小数,常规方法是人为四舍五入,但计算机不能和人一样直接进行处理,需要给计算机提供一个算法来让计算机实现四舍五入,因此我认为可以这样做:
-
保留三位小数:(1998.1120+0.0005)*1000=1998112.5, 对199811.25进行强制类型转换取整得1998112,再除以1000即得1998.112,结果正确;
-
保留两位小数:(1998.1120+0.0055)*100=199811.75,进行强制类型转换得199811,除以100得1998.11,结果正确;
-
保留一位小数:(1998.1120+0.0555)*10=19981.675,进行强制类型转换得19981,除以10得1998.1,结果正确;
-
保留0位小数:(1998.1120+0.5555)*1=1998.6675,进行强制类型转换得1998,除以1得1998,结果正确;
结论
对上述操作进行归纳总结可以得出这样一个结论:对于n位小数,若要保留m(m<=n)位小数,则需要加0.0···5···,共m个0,n-m个5,然后再乘10···(n个0),进行强制类型转换取整后再除以相同的数所得结果即为正确的四舍五入后的数。
代码实现
我在拿多个数尝试之后发现方法可行,于是尝试用代码实现该过程,通过程序来进一步测试该方法是否可行,具体代码如下:
#include <stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
int main(int argc, const char * argv[]) {
double num;
int temp,count1=0,i,count2=0,n,flag=0;
printf("请输入需要取近似值的小数:");
scanf("%lf",&num);//假设输入为10.254
//当num为负数时将其转为正数处理,引入检测变量flag为以后还原做准备
if(num<0){
num=fabs(num);
flag=1;
}
//计算num的整数位数 ,count1=2
temp=(int)num;
while(temp!=0){
temp/=10;
count1++;
}
//将num转换为字符串形式,s[50]="10.254000"
char s[50];
sprintf(s,"%f",num);