(碎碎念)
有问题欢迎指正。
一、函数round。
头文件:<math.h>
功能:将浮点数按四舍五入取到整数。
可能是我的编译器问题,不满足预期目标。(如图)
二、".nf"。
对于大部分浮点数可用,但对于.5不友好。(见图)
三、自定义精度。
针对以上问题,我自己写了一段代码,实现取精度自由。
(一)、预期。
输入一个浮点数以及想要的精确度,就能得到结果。
(二)、思路。
1.正数。
主要是对于.5问题。
接下来用a表示浮点数,ia(取自(int)a)表示对应的整型。
以a=2.5为例。
a - ia = 0.5,如果我们以0.5为界限,当小数减去强制转换的整数不小于0.5时,ia++,那么就成功进一。
当需要精度较高时。
我们不好直接对需要的数位进行操作,可以选择放缩的方法,将我们需要的数字扩大。
例如,a = 3.14159,我们想精确到第三位,可将a扩大10^3,得到3141.59;
此时因为a - ia = 0.59 > 0.5,ia++得到3142;
然后将3142/(10^3)= 3.142,就是我们想要的结果。
2.负数。
负数转换思路与正数并无太大区别,只是a - ia需要改为<=0.5,并且将对应语句改为ia--即可。
(三)、代码。
#include<stdio.h>
#include<math.h>
double a45(double x, int y) //对a四舍五入,a45;
{
int ix;
x *= pow(10, y); //扩大
ix = (int)x;
if (x > 0)
{
if (x - ix >= 0.5)ix++;
}
else
{
if (ix - x >= 0.5)ix--;
}
x = ix / pow(10, y);
return x;
}
int main()
{
double a = 0.0,w;
int n = 0;
printf("请输入操作数以及需要的精度\n");
scanf("%lf%d", &a, &n);
w = a45(a, n);
printf("%f取精确度为%d时:%.*f", a, n, n, w);
return 0;
}