HOWTO · Arduino
如何在 Arduino 中将浮点数四舍五入到最接近的整数
了解 Arduino 的 round() 如何将浮点值四舍五入到最接近的整数、正负中点值的表现,以及如何四舍五入到选定的小数位数。
本页内容
使用 Arduino 的 round() 函数可以从 float 中获得最接近的整数值。介于两个整数正中间的值会向远离零的方向舍入,因此 5.5 变为 6,-3.5 变为 -4。当整数值更适用时,可以将结果存为 int。
Arduino 中 round() 的作用
round() 返回一个浮点值,其数值是最接近的整数。将该结果赋值给 int 就会存储这个整数值。例如,round(3.6) 产生 4,而 round(-2.3) 产生 -2。该函数改变的是后续计算所使用的值;除非您将结果赋回原变量,否则它不会改变原始变量。
下面这个完整的 C++ 程序演示了整数舍入,以及将测量值缩放至小数点后两位进行舍入。它使用标准 C++ 的 round 函数,该函数遵循相同的规则;在 Arduino 草图中,按需调用 round() 并将值发送到 Serial。该示例是自包含的,运行时会打印带标签的结果。
#include <cmath>
#include <cstdio>
int main() {
float positive = 5.5f;
float belowZero = -3.5f;
float measurement = 7.4567f;
int roundedPositive = static_cast<int>(std::round(positive));
int roundedBelowZero = static_cast<int>(std::round(belowZero));
float roundedMeasurement = std::round(measurement * 100.0f) / 100.0f;
std::printf("positive: %d\n", roundedPositive);
std::printf("below zero: %d\n", roundedBelowZero);
std::printf("measurement: %.2f\n", roundedMeasurement);
return 0;
}
对正值和负值进行舍入
对于正值,选择最接近的整数:小于中点的值向下舍入,大于或等于中点的值向上舍入。因此,5.4 变为 5,而 5.5 和 5.6 变为 6。在确切的中点处,结果向远离零的方向移动。
对于负值,适用相同的中点规则。例如,-3.4 变为 -3,而 -3.5 和 -3.6 变为 -4。这不是银行家舍入:中点值不会为了偏向偶数整数而改变方向。如果结果将被赋值给 int,请选择其舍入结果能适合该类型范围的输入值。
舍入到选定的小数位数
round() 本身舍入到整数。要将一个值舍入到选定的小数位数,请乘以相应的 10 的幂,调用 round(),然后再除以该因子。对于小数点后两位,因子是 100;例如,7.4567 变为约 7.46。
这种缩放方法适用于许多显示和计算需求,但 float 值以有限的二进制精度存储。十进制值可能无法被精确表示,因此接近中点的值的表现可能与理想的十进制运算不同。对于需要更高精度的计算,请保留原始值;当您只需要固定数量的可见小数位时,对值进行格式化以便显示。缩放也不会使存储的值变得精确;它会根据可用的精度改变舍入结果。
在 Arduino 草图中使用舍入后的值
在草图中,将结果赋值到整数适用的地方,例如选择数组索引或显示整数读数时。在赋值之前,检查舍入后的值是否适合 int 的范围。对于串口显示,Serial.println(round(sensorValue)); 会打印舍入后的值。上面的完整程序是一个主机端的 C++ 示例,不使用 Arduino 硬件或 Arduino 的 Serial 对象。
在映射之前,舍入是可选的:map() 接受整数参数,因此当先将浮点读数转换为整数时,舍入可能会有帮助,但并非每个映射任务都需要它。有关其整数映射行为,请参阅 Arduino map() 函数。