[英]Source code to round floating point number
除了使用诸如ceil
和floor
任何内置函数外,如何舍入浮点数?
我想将2.10转换为2.14-> 2.1并将2.15转换为2.19-> 2.2
我写了一些逻辑但是卡在中间
float a = 2.24;
int b = a*100;
int result n, i =0;
while(i>2)
{
n = b%10;
i++;
}
if(n >5)
{
c = b%10;
c = c/10 + 1;
}
我尝试了很多inbuild函数,但是对于我的diab编译器来说,所有这些都不起作用
// totalDist = roundf(totalDist * 10) / 10.0;
// totalDist = floor(totalDist * pow(10., 1) + .5) / pow(10., 1);
totalDist = floorf(totalDist * 10 + 0.5) / 10;
打算写自己的逻辑
float a = 2.24;
float b = roundf(a*10.0f)/10.0f;//roundf in C99
如果您只想四舍五入以用于输出目的,那么%.1f
格式字符串确实是正确的答案。
printf("%.1f", 2.14);
或者,如果您实际上想舍入价值,那么类似的工作
#include <math.h>
float val = 37.777779;
float rounded_down = floorf(val * 100) / 100; /* Result: 37.77 */
float nearest = floorf(val * 100 + 0.5) / 100; /* Result: 37.78 */
float rounded_up = ceilf(val * 100) / 100; /* Result: 37.78 */
通常我们使用nearest
方法
BLUEPIXY的答案很好。 但总的来说; 浮点乘法比除法快,所以如果速度合适的话; 乘以0.1,而不是除以10。
因为我的旧答案需要很多仔细的编程才能使其起作用
您可以轻松地检查(正/负)数字是否被向上或向下四舍五入(加/减)0.5。 然后,您可以截断结果并得到答案。 另外,为了根据需要支持更深层次的舍入,可以让用户指定舍入和舍弃的舍入位数为多少位,瞧:
long double round_f(long double number, int decimal_places)
{
assert(decimal_places > 0);
double power = pow(10, decimal_places-1);
number *= power;
return (number >= 0) ? ((long long)(number + 0.5))/power : ((long long)(number - 0.5))/power;
}
您可以使用sprint:
#include <stdio.h>
int main(void)
{
float a = 2.24;
int size;
char num[8] = {0};
sprintf(num, "%d", (int) (a * 100));
for (size=0; num[size]; size++);
size--;
if (num[size] < '5') {
num[size] = '0';
} else {
num[size] = '0';
if (num[size-1] == '9')
num[size-1] = '0';
else
num[size-1]++;
}
printf("a = %f\n", a);
printf("num = %s\n", num);
return(0);
}
您可以看到逻辑。 最后,您可以将字符串还原为整数并乘以100。
编辑:这只是逻辑。 请参阅下面的评论,以了解充分工作所需的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.