在 C 语言中将浮点数四舍五入到小数点后 2 位?

Round float to 2 decimal places in C language?

提问人:GanzYe 提问时间:10/16/2022 最后编辑:GanzYe 更新时间:10/16/2022 访问量:1448

问:

   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

c 舍入 精度

评论

1赞 Cheatah 10/16/2022
为什么需要小数点后 2 位?你在处理钱吗?在这种情况下,以美分(作为长整数)计算,并在需要表示值时进行诡计。
0赞 GanzYe 10/16/2022
是的,我用钱工作,但我每次需要将经常账户乘以 0.1%,然后四舍五入到小数点后 2 位。
2赞 Fe2O3 10/16/2022
如果你正在使用货币,这是一个糟糕的起点......虽然这可能来自其他一些计算,但四舍五入(或截断)应该(可能)在尝试添加 10% 之前完成(以及之后......如果你想让数字理解人们对货币的看法,那么要么使用整数类型(内部以便士为单位),要么使用四舍五入、四舍五入、四舍五入......事情就是这样。123.8798831;

答:

2赞 eerorika 10/16/2022 #1

必须将数字存储在变量中,因为 number = 136.25

但那将是不正确的结果。的精确结果是 136.26787141。当您将其向下舍入到小数点后 2 位时,您将得到的数字是 136.26,而不是 136.25。number + number * 0.1

但是,无法将 136.26 存储在浮点数中,因为它根本不是可表示的值(在您的系统上)。你能得到的最好的值是一个非常接近它的值。您已成功生成一个非常接近 136.26 的浮点数。如果不能接受值中的细微误差,则不应使用有限精度浮点运算。

如果您希望打印浮点数的值,最多只能打印有限的小数数,则必须了解并非所有值都可以用浮点数表示,并且必须使用它来获得所需的输出。%.2f

在 C 语言中将浮点数四舍五入到小数点后 2 位?

就像你所做的那样:

  • 乘以 100
  • 除以 100

评论

0赞 GanzYe 10/16/2022
我用钱工作,我需要每次将经常账户的钱乘以 0.1%,然后四舍五入到小数点后 2 位。
2赞 David C. Rankin 10/16/2022
如果您使用货币,请考虑使用整数类型来表示值。使用以美分为单位的值。除以 100 得到美元,你已经有美分了。强烈建议不要使用浮点来赚钱。银行对到处损失便士很挑剔。 给你美分或美元。足以代表地球的价值。如果这还不够,请使用大数字库。int64_t9.2234e+189.2234e+16
0赞 Saw 10/16/2022 #2

下面是一个函数示例,可用于四舍五入到小数点后 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;
}

评论

0赞 David C. Rankin 10/16/2022
仅仅使用就足够了,不需要分配和释放吗?(虽然很高兴看到诀窍)另外,您预计输出是多少。有点很难看出改进是如何完成的,还是我错过了什么?char buffer[32];snprintf (NULL, 0 ...)37.77999937.777779
1赞 Stuart 10/16/2022 #3

我同意其他评论/答案,即使用浮点数赚钱通常不是一个好主意,并非所有数字都可以准确存储。基本上,当您使用浮点数时,您牺牲了能够存储非常大和非常小的数字以及能够存储小数的精确性。在处理真钱时,你不想牺牲准确性,但我认为这是一个学生项目,没有计算实际的钱,所以我写了一个小程序来展示一种方法。

#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 类型。您问题中的代码应该给您一个警告,因为在doublefloatdoubledoublefloat

float number = 123.8798831;

123.8798831 属于类型,必须转换为(在此过程中可能会失去进动)。doublefloat

您还应该注意到,我的程序以 0.1% 计算利息(就像您说的那样),这与您问题中的代码以 10% 计算利息不同。您的代码乘以 0.1,即 10/100 或 10%。