如何将浮点数限制为小数点后一位

问题描述

我有一个浮点数 242.1356783 和 -87.10234512, 我需要将其限制为 242.1 我在 cortex m4 微控制器上尝试了以下

1.data[i] = (int)(data[i] *10);
数据[i] = 数据[i]/10;

2.data[i]=ceilf(data[i] * 100)/100;

3.data[i] = roundf(data[i]*100)/100; 但没有工作。

有人有其他解决方案吗?

解决方法

浮点 (FP) 数通常使用二进制表示法进行编码:一些 whole number * power of 2

242.1 和 -87.1 则不能完全编码为 FP 数字。而是使用附近的一个。

我需要将其限制为 242.1

OP 可以使用以下内容:(使用 round() 代替 roundf() 以避免溢出)。

data[i] = (float) (round(data[i]*10.0)/10);

更复杂,但不调用 double 数学,但可以处理大多数情况*

// If there is a fraction ...
if (fmodf(data[i],1.0f) && isfinite(data[i])) {
  data[i] = roundf(data[i]*10.0f)/10;
}

最佳解决方案涉及更改更高级别的目标。也许将值缩放 10。示例:内部使用 2421.0 分度而不是 242.1 度。

或等待语言更新:C 2x 可能支持十进制 FP。


OP 提出的想法的弱点:

  1. data[i] = (int)(data[i] *10); data[i] = data[i]/10;:在大约 50% 的时间内没有朝正确的方向取整。当 data[i] *10 超出 int 范围时失败。

  2. data[i]= ceilf(data[i] * 100)/100;:在大约 50% 的时间内没有朝正确的方向取整。 data[i] *10 可能会溢出。我怀疑 OP 在这里想要 10 个。

  3. data[i] = roundf(data[i]*100)/100; data[i] *100 可能会溢出。我怀疑 OP 在这里想要 10 个。


*data[i]*10.0f 和乘积不精确且接近 xxx.x5 时,可能会错误地舍入

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...