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 这样的数字。
试试这两件事:
- 使用
%.2f
打印结果,然后再次使用 %.20f
。 (我假设您使用的是 printf
。)
- 使用类型
double
而不是 float
。
要问的另一个问题是,您为什么要四舍五入这些数字?是因为它们只对两个地方有意义吗?是因为您想以这种方式显示它们吗?是因为它们应该代表美元和美分(或其他一些百分制货币)吗?
- 如果数量只对两个地方有意义,那么您当前所做的四舍五入应该是正确的。
- 如果要将浮点数显示到两个位置,只需使用
%.2f
,不用担心自己显式舍入。
- 如果您试图操纵美元和美分,则全面使用整数数学(代表美分)通常要容易得多。
用于 float
的二进制浮点数与 十进制 表示不完全一致。当您使用 roundf()
时,您正在四舍五入 binary 表示。当 以十进制表示 时,内部表示和表示之间的不匹配就很明显了。
解决办法是完全不对浮点变量进行舍入,而是在printf( "%.2f", f )
中用格式说明符指定表示。
例如 8.084 会四舍五入为 8.07999992,因为这是最接近 8.08 的二进制浮点值。
请注意,float
适用于大约 6 位有效小数位,这是您可以依赖尾随的 8.07999 的全部...992 通常应被忽略。
我想将两个浮点值四舍五入到两位小数。
这是浮点数数组:
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 这样的数字。
试试这两件事:
- 使用
%.2f
打印结果,然后再次使用%.20f
。 (我假设您使用的是printf
。) - 使用类型
double
而不是float
。
要问的另一个问题是,您为什么要四舍五入这些数字?是因为它们只对两个地方有意义吗?是因为您想以这种方式显示它们吗?是因为它们应该代表美元和美分(或其他一些百分制货币)吗?
- 如果数量只对两个地方有意义,那么您当前所做的四舍五入应该是正确的。
- 如果要将浮点数显示到两个位置,只需使用
%.2f
,不用担心自己显式舍入。 - 如果您试图操纵美元和美分,则全面使用整数数学(代表美分)通常要容易得多。
用于 float
的二进制浮点数与 十进制 表示不完全一致。当您使用 roundf()
时,您正在四舍五入 binary 表示。当 以十进制表示 时,内部表示和表示之间的不匹配就很明显了。
解决办法是完全不对浮点变量进行舍入,而是在printf( "%.2f", f )
中用格式说明符指定表示。
例如 8.084 会四舍五入为 8.07999992,因为这是最接近 8.08 的二进制浮点值。
请注意,float
适用于大约 6 位有效小数位,这是您可以依赖尾随的 8.07999 的全部...992 通常应被忽略。