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



我有一个浮点数242.1356783和-87.10234512,我需要把它限制在242.1我在下面尝试了cortex m4微控制器

1。[我]= (int)的数据(数据[我]* 10);
数据[我]=[我]/10;

2。Data [i]= ceilf(Data [i] * 100)/100;

3。Data [i] = rounddf (Data [i]*100)/100;

有人有其他解决方案吗?

浮点数通常使用二进制表示法进行编码:某个整数* 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 deci-degrees而不是242.1 degrees。

或者等待语言更新:c2x可能支持十进制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和product不精确且接近xxx.x5时不正确舍入

最新更新