提问人:GanzYe 提问时间:10/16/2022 最后编辑:GanzYe 更新时间:10/16/2022 访问量:1448
在 C 语言中将浮点数四舍五入到小数点后 2 位?
Round float to 2 decimal places in C language?
问:
float number = 123.8798831;
number=(floorf((number + number * 0.1) * 100.0)) / 100.0;
printf("number = %f",number);
我想得到number = 136.25
但是编译器向我展示了number = 136.259995
我知道我可以这样写,但我需要数字本身才能进一步操作。必须将数字存储在变量中,如下所示printf("number = %.2f",number)
number = 136.25
答:
必须将数字存储在变量中,因为 number = 136.25
但那将是不正确的结果。的精确结果是 136.26787141。当您将其向下舍入到小数点后 2 位时,您将得到的数字是 136.26,而不是 136.25。number + number * 0.1
但是,无法将 136.26 存储在浮点数中,因为它根本不是可表示的值(在您的系统上)。你能得到的最好的值是一个非常接近它的值。您已成功生成一个非常接近 136.26 的浮点数。如果不能接受值中的细微误差,则不应使用有限精度浮点运算。
如果您希望打印浮点数的值,最多只能打印有限的小数数,则必须了解并非所有值都可以用浮点数表示,并且必须使用它来获得所需的输出。%.2f
在 C 语言中将浮点数四舍五入到小数点后 2 位?
就像你所做的那样:
- 乘以 100
- 圆
- 除以 100
评论
int64_t
9.2234e+18
9.2234e+16
下面是一个函数示例,可用于四舍五入到小数点后 x 个数。
法典:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stddef.h>
double dround(double number, int dp)
{
int charsNeeded = 1 + snprintf(NULL, 0, "%.*f", dp, number);
char *buffer = malloc(charsNeeded);
snprintf(buffer, charsNeeded, "%.*f", dp, number);
double result = atof(buffer);
free(buffer);
return result;
}
int main()
{
float number = 37.777779;
number = dround(number,2);
printf("Number is %f\n",number);
return 0;
}
评论
char buffer[32];
snprintf (NULL, 0 ...)
37.779999
37.777779
我同意其他评论/答案,即使用浮点数赚钱通常不是一个好主意,并非所有数字都可以准确存储。基本上,当您使用浮点数时,您牺牲了能够存储非常大和非常小的数字以及能够存储小数的精确性。在处理真钱时,你不想牺牲准确性,但我认为这是一个学生项目,没有计算实际的钱,所以我写了一个小程序来展示一种方法。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
double number, percent_interest, interest, result, rounded_result;
number = 123.8798831;
percent_interest = 0.1;
interest = (number * percent_interest)/100; //Calculate interest of interest_rate percent.
result = number + interest;
rounded_result = floor(result * 100) / 100;
printf("number=%f, percent_interest=%f, interest=%f, result=%f, rounded_result=%f\n", number, percent_interest, interest, result, rounded_result);
return EXIT_SUCCESS;
}
正如你所看到的,我改用 ,因为有更多的进动和浮点常数是 not 类型。您问题中的代码应该给您一个警告,因为在double
float
double
double
float
float number = 123.8798831;
123.8798831 属于类型,必须转换为(在此过程中可能会失去进动)。double
float
您还应该注意到,我的程序以 0.1% 计算利息(就像您说的那样),这与您问题中的代码以 10% 计算利息不同。您的代码乘以 0.1,即 10/100 或 10%。
评论
123.8798831;