【问题标题】:how to restrict float number to 1 digit after decimal point如何将浮点数限制为小数点后1位
【发布时间】:2021-04-23 20:32:07
【问题描述】:

我有一个浮点数 242.1356783 和 -87.10234512, 我需要将其限制为 242.1 我在下面尝试了皮质 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; 但没有任何工作。

有人有其他解决方案吗?

【问题讨论】:

  • 242.1 不能用二进制浮点表示,所以你只能希望有一个接近的近似值。获得最接近的近似值是一个难题。 roundf(x*10)/10 并不总是最接近的,但也不是那么糟糕......你应该想知道为什么你想要一些不适合二进制浮点数的东西?真的是你需要的吗?

标签: floating-point decimal restrict


【解决方案1】:

浮点 (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 可能支持十进制浮点数。


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 时,可能会舍入错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2011-03-10
    • 2018-03-04
    • 2022-01-11
    相关资源
    最近更新 更多