先看程序运行画面:
实现这个看似简单实际上比较复杂,话不多说直接开始。
程序主体:
这里的founction函数会根据输入的n,来修改a。
print函数则实现a的打印。为什么不直接打印修改后的a呢?举个例子,浮点数 x=0.1,你调用printf函数打印x的话输出的会是0.1000000。后面这么多0,长得太丑了,所以我们不直接printf打印(这一步不要求的同学可以跳过)。
founction函数:
这里比较复杂,我先举个例子:我们如果将0.123保留两位小数该怎么搞呢?保留两位小数就是要得到0.12嘛,可能很多人想到了利用整形会忽略小数的特性,先将0.123乘以100,得到12.3,再转换成整形,于是就变成12啦,那12怎么转换到0.12呢?直接用12乘以0.01就好了嘛。
通过这个例子我们再看这个founction函数是不是就豁然开朗了呢?也就是先把a乘以10的n次方,再转换为整形(这里的long long 也属于整形,至于为什么不用int后面讲)去掉小数部分,再乘以10的负n次方变回小数。这样通过founction函数修改后的a就是我们想要的那个数啦。
接下来要做的是将a打印在屏幕上,这里其实方法很多,以下是我给出的办法。
print函数:
我想出的一个办法是先打印整数部分,再打印小数部分。
第一步先故技重施把a的整数部分给integer(这个单词是整数的意思),然后把它打印出来
第二步打印一个小数点 “ . ” ,很简单
最后一步比较复杂,我们慢慢看: 我们想要得到小数部分,先要把小数点前面的整数部分去掉,可以直接用我们的a减去integer(注意变量类型要转换成一样的),也就是(a-(long double)integer)这一步,如果a等于9.123的话,我们会得到0.123。但是我们想打印的是123,所以要乘以10的n次方,也就是 ((a - (long double)integer) * pow(10, n)) 这一步。最后将它转换成整形打印出来,就大功告成了!
为什么要使用long long 和long double类型
使用int或float类型存在以下问题:
1.数值范围太小,初始化定义一个较大的数值会导致信息丢失
2.转换方面存在问题,在founction函数中需要乘10的n次方,可能存在溢出问题
3.使用单精度浮点型精度远远不够,当你输入较大的n时打印出的跟原来的数甚至会对不上,这是单精度浮点型不够准确而导致的。
所有代码均个人创作,如需引用请标明出处。
全部代码:
#include <stdio.h>
#include <math.h>
void founction(long double* a, int n)
{
long double temp = *a;
temp *= pow(10, n);
long long v = (long long)temp;
*a = v * pow(10, -n);
}
void print(long double a,int n)
{
int integer = (int)a;
printf("%d", integer);
printf(".");
int decimal = (int)((a - (long double)integer) * pow(10, n));
printf("%d",decimal);
}
int main()
{
long double a = 99.123456789;
int n;
printf("a=%.9llf,保留到小数点后多少位?\n:>", a);
scanf("%d", &n);
founction(&a, n);//修改a的值
print(a,n);//将修改后的a精确打印出来
return 0;
}
如有疏漏,欢迎大佬指正!!!
FreshmanStudyC