为何整数加1转float得0.99?Processing控制Arduino MeArm技术咨询
为啥整数加1转float会得到0.99?
首先得说,正常情况下绝对不会出现这种情况啊!比如你写int num = 0; float result = num + 1;,得到的肯定是1.0,float完全能精确表示这类小整数。你遇到的这个情况,大概率是代码里有其他隐藏逻辑在搞鬼,我给你列几个最可能的原因:
- 是不是把变量搞混了? 比如你以为是给某个整数加1,但实际代码里是另一个变量,或者不小心写成了减1?比如误把
+1写成-1,那如果原变量是1,结果就是0,不过也不是0.99就是了… - 前置操作的精度坑:比如这个整数本身是从浮点数强转来的?比如之前有
int num = (int)0.999999;,这时候num是0,加1后是1,转float是1.0,但如果是你从传感器或者外部设备读进来的数值本身带误差,转成整数后又经过了其他运算? - 输出格式化的锅:会不会是你打印结果的时候,用了限制小数位数的格式?比如用
nf(result, 1, 2)来输出,那如果实际结果是0.994999,就会被显示成0.99,但真实值其实不是这个数? - 极端情况的溢出? 比如你用了无符号整数,当它的值是最大值(比如32位无符号的4294967295),加1后会溢出变成0,转float是
0.0,但这也不是0.99。不过如果是其他溢出场景?可能性不大,但也可以检查下变量类型。
总的来说,你得仔细看看代码里这个整数的来源、运算顺序,还有结果的输出方式,肯定是某个环节出了小疏漏。
关于Processing做MeArm控制GUI的序列执行问题
哇,你这个思路挺靠谱的!用ControlP5做滑块或者旋钮来控制四个舵机,然后存成整数变量,执行序列的时候一步步加减到目标值,这样舵机移动起来会很平滑,不会猛地跳过去,对MeArm的机械结构也友好。
我给你几个实际开发中有用的小建议,帮你避坑:
- 别用delay()卡界面! 如果你直接用
delay()来控制步进速度,整个GUI会卡住,用户根本没法操作。换成用millis()做非阻塞的时间控制,比如:long lastStep = 0; final int STEP_DELAY = 15; // 每15ms走一步,可根据舵机速度调整 void updateElbow(int current, int target) { if (millis() - lastStep >= STEP_DELAY) { if (current < target) current++; else if (current > target) current--; // 把current值发给Arduino或者更新ControlP5组件 lastStep = millis(); } } - 用类来封装序列步骤:四个舵机的数值单独存太麻烦,不如写个小类把它们打包:
然后用class ArmStep { int base, shoulder, elbow, wrist; ArmStep(int b, int s, int e, int w) { base = b; shoulder = s; elbow = e; wrist = w; } }ArrayList<ArmStep>来存整个序列,添加步骤的时候直接sequence.add(new ArmStep(bVal, sVal, eVal, wVal));,执行的时候遍历列表就行,代码会清爽很多。 - 加个状态锁:执行序列的时候,最好禁止用户调整ControlP5的组件,不然一边执行一边改值,会乱套。加个布尔变量
isPlaying,执行时设为true,处理ControlP5事件的时候先判断if (!isPlaying)再更新变量,执行完再把isPlaying设为false。 - 边界检查不能少:MeArm的舵机一般有角度范围(比如0-180度),每次更新数值的时候用
constrain(current, 0, 180)把值限制在合法范围内,别给Arduino发超出范围的指令,烧坏舵机就麻烦了。 - 串口通信要稳:给Arduino发舵机值的时候,别每次发一个数,最好打包成一个字符串,比如
"B:90,S:45,E:120,W:0\n",Arduino那边解析这个字符串再分别控制四个舵机,这样比单独发送四个值不容易出错。
如果你在写代码的时候遇到具体问题,比如序列执行到一半卡住、舵机不响应,或者值匹配有问题,把相关的代码片段贴出来,我再帮你细查~
内容的提问来源于stack exchange,提问作者Janaga
相关产品推荐
相关产品推荐

