实数截断式保留两位小数 不四舍五入保留两位小数
时隔两年,我胡汉三又回来啦!嚯哈哈哈哈!!!
项目场景:
我们的编译器一般都是自动帮我们在输出数据的时候四舍五入的,那么当我们想不用四舍五入进行输出的时候该怎么处理嘞???
问题描述
关于这种问题我找了很多网上的例子但是没有很满意的,所以就想到了用字符串,将数字“字符”化,这样在输出的时候就不会受到干扰啦!
不过,我最初犯了一个错误
我们需要输出的数据一般带小数点,但是全面考虑各种情况有以下几种:
1
1.0
1.00
1.000…
对应的输出(保留两位小数)应该是
1.00
1.00
1.00
1.00
如果输入记为字符串,那么最后一种输入的操作是最简单的,很多人想到通过判断字符串长度比对,某问忒啦!不过处理小数点才是最重要的,我们要确定小数点后一共有几位数字,因为不足两位的话我们是要自动补齐滴,所以我最初是通过判断出现小数点后“\n”的位置来判断的,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int main()
{
char str[20]={ };
int n,flag=0;
scanf("%s", str);
n = strlen(str);
for (int i = 0; i < n; i++)
{
printf("%c", str[i]);
if (str[i] == '.')
{
flag = 1;
if (str[i+1]!='\n'&&str[i+2]!='\n')
{
printf("%c%c", str[i + 1], str[i + 2]);
break;
}
if (str[i+1]!='\n'&&str[i+2]=='\n')
{
printf("%c", str[i + 1]);
printf("0");
break;
}
if (str[i+1]=='\n')
{
printf("00");
break;
}
}
}
if (flag == 0)
printf(".00");
system("pause");
return 0;
}
但是这样是有问题的
look我的输出
哎嘿,为啥子嘞?明明写的很像那么回事嘛!
原因分析:
这就是scanf的作用啦,作为一个小垃圾(指我自己),我想了一个晚上才看透其中道理,一句话点破:scanf不会读入‘\n’,呜呜呜!!!!他读到’\n’就结束啦,所以永远不会在str[i+1]或者str[i+2]中读到’\n’。you no?
解决方案:
解决办法很简单,就是别整啥花里胡哨,直接通过str长度判断就可以啦!
完整代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int main()
{
char str[20]={ };
int n,flag=0;//flag用来记录输入有没有小数点,没有小数点输入flag==0
scanf("%s", str,sizeof(str));
n = strlen(str);
for (int i = 0; i < n; i++)
{
printf("%c", str[i]);
if (str[i] == '.')
{
flag = 1;//有小数点
if (i+2<=n-1)//输入为1.00及1.000...类型
{
printf("%c%c", str[i + 1], str[i + 2]);
break;
}
if (i+1==n-1)//输入为1.0类型
{
printf("%c", str[i + 1]);
printf("0");
break;
}
if (i==n-1)//输入为1.类型(这种类型都不算是数,哈哈哈,以防万一)
{
printf("00");
break;
}
}
}
if (flag == 0)//输入为整数
printf(".00");
return 0;
}