关于数据跳变的解决办法

关于数据跳变的解决办法

原代码存在问题:比如 9.9 → 直接变成 9,10.1 → 直接变成 10,肉眼看就是跳变

// 计算使用量
if(forward_rounds_11 > reverse_rounds_12)
{
    fertilize_weight = fertilize_sta * forward_rounds_11 * (204.0 - Ultrasonic_distance) * 10.0;
}
else
{
    fertilize_weight = fertilize_sta * reverse_rounds_12 * (204.0 - Ultrasonic_distance) * 10.0;
}

可能原因如下:

  • Ultrasonic_distance 是实时传感器值,本身会轻微抖动,差 0.1cm → 整个结果直接跳 1~2 甚至更多

  • 变量类型是 int(整数),没有小数缓冲,比如 9.9 → 直接变成 9,10.1 → 直接变成 10,肉眼看就是跳变

  • 乘数太大(×10),传感器轻微抖动被放大 10 倍

  • 没有做平滑滤波,传感器原始值直接参与计算,必然跳

解决方案 :浮点计算 + 四舍五入

// 在代码文件最顶部,加上头文件
#include <math.h>
// 先算浮点值
float temp_weight;

if(forward_rounds_11 > reverse_rounds_12)
{
    temp_weight = fertilize_sta * forward_rounds_11 * (204.0f - Ultrasonic_distance) * 10.0f;
}
else
{
    temp_weight = fertilize_sta * reverse_rounds_12 * (204.0f - Ultrasonic_distance) * 10.0f;
}

// 关键:四舍五入,避免 9.999 变成 9,10.001 变成 10
fertilize_weight = round(temp_weight); 
posted @ 2026-04-27 12:55  Q&25  阅读(13)  评论(0)    收藏  举报