浮点数 根据输入的值确定输出小数点后的位数

本文介绍了如何使用longdouble和longlong类型处理浮点数,以解决精度、数值范围和溢出问题,通过function函数调整并精确打印浮点数,以避免小数点后多余的0和保证准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看程序运行画面:

程序主体

这里的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值