如何修复Modbus-RTU电源配置工具中int转十六进制的固定0.01偏差问题
问题根因与修复方案
1. 浮点数转整数精度损失(导致0.01固定偏差的核心原因)
你传入GenerateInputCode的int参数由double类型设置值*100直接强制转换得到,由于浮点数的存储精度特性,类似2.55这类十进制值无法被double精确存储,计算2.55*100时实际得到的结果可能是254.9999999999999而非精确的255。C#中double强制转int会直接截断小数部分,最终得到254而非预期的255,对应电源端显示就会少0.01。
- 修复方法:转换时添加四舍五入逻辑:
int voltageParam = (int)Math.Round(targetVoltage * 100); int currentParam = (int)Math.Round(targetCurrent * 100);
2. 八进制字面量错误
你代码中referenceValuesFix数组的数值大量使用前导0开头(例如024、057),C#语法规定以0开头的整数字面量会被识别为八进制数,例如024实际对应十进制的20,而非你预期的24,部分数值如029甚至属于非法八进制(八进制数位范围为0-7),会直接导致编译错误。
- 修复方法:删除数组中所有数值的前导0,直接写十进制数值即可。
补充说明
你代码中int转ushort、再拆分高低字节的逻辑完全正确,255转换后得到的确实是0x00 0xFF,和你举例的正确指令一致,字节转换环节没有问题。
内容的提问来源于stack exchange,提问作者brunoM94
相关产品推荐
相关产品推荐

