实数截断式保留两位小数

实数截断式保留两位小数 不四舍五入保留两位小数

时隔两年,我胡汉三又回来啦!嚯哈哈哈哈!!!

项目场景:

我们的编译器一般都是自动帮我们在输出数据的时候四舍五入的,那么当我们想不用四舍五入进行输出的时候该怎么处理嘞???


问题描述

关于这种问题我找了很多网上的例子但是没有很满意的,所以就想到了用字符串,将数字“字符”化,这样在输出的时候就不会受到干扰啦!
不过,我最初犯了一个错误
我们需要输出的数据一般带小数点,但是全面考虑各种情况有以下几种:
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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值