STM32F中C中的圆形浮点数

Round float in C in STM32F

我想将两个浮点值四舍五入到两位小数。

这是浮点数数组:

float result[2];

这是四舍五入操作:

result[0] = roundf( result[0] * 100 ) / 100;
result[1] = roundf( result[1] * 100 ) / 100;

为值:

-3.99520659

我期望 -4,我得到 -4

但对于值:

8.07999992

我希望是 8 个,但我得到的是相同的数字。

对于其他情况,我希望数字看起来像 3.4 o -2.1

我能做什么?

谢谢!

您的代码可能正确地将 8.07999992 舍入为 8.08。但随后它可能再次打印为 8.07999992。这是由于浮点数的精度有限(float 类型的精度比 double 更有限),而且事实上,在二进制中,没有 8.08 这样的数字。

试试这两件事:

  1. 使用 %.2f 打印结果,然后再次使用 %.20f。 (我假设您使用的是 printf。)
  2. 使用类型 double 而不是 float

要问的另一个问题是,您为什么要四舍五入这些数字?是因为它们只对两个地方有意义吗?是因为您想以这种方式显示它们吗?是因为它们应该代表美元和美分(或其他一些百分制货币)吗?

  • 如果数量只对两个地方有意义,那么您当前所做的四舍五入应该是正确的。
  • 如果要将浮点数显示到两个位置,只需使用%.2f,不用担心自己显式舍入。
  • 如果您试图操纵美元和美分,则全面使用整数数学(代表美分)通常要容易得多。

用于 float 的二进制浮点数与 十进制 表示不完全一致。当您使用 roundf() 时,您正在四舍五入 binary 表示。当 以十进制表示 时,内部表示和表示之间的不匹配就很明显了。

解决办法是完全不对浮点变量进行舍入,而是在printf( "%.2f", f )中用格式说明符指定表示

例如 8.084 会四舍五入为 8.07999992,因为这是最接近 8.08 的二进制浮点值。

请注意,float 适用于大约 6 位有效小数位,这是您可以依赖尾随的 8.07999 的全部...992 通常应被忽略。