JavaScript实现0-99与0-100数值范围双向互转的最佳方法
JavaScript 0-99与0-100数值范围双向转换方案
核心转换逻辑
针对Homebridge MQTT-Thing(0-100范围)和zwavejs2mqtt设备(0-99范围)的适配需求,双向转换逻辑如下:
- 下行方向(MQTT-Thing → 设备):将0-100的数值线性映射到0-99区间,保证输入100时输出99,输入0时输出0
- 上行方向(设备 → MQTT-Thing):将0-99的数值线性映射到0-100区间,保证输入99时输出100,输入0时输出0
可直接复用的代码实现
下行编码函数(发往zwave设备)
用于MQTT-Thing发送控制指令前的数值转换:
// 输入:0-100范围的数值,输出:0-99范围的合法设备数值 function convert100To99(input) { // 先处理非法输入,裁剪到合法范围 const validInput = Math.max(0, Math.min(100, Number(input) ?? 0)); return Math.round(validInput * 99 / 100); }
上行解码函数(接收zwave设备上报)
用于MQTT-Thing接收设备状态后的数值转换:
// 输入:0-99范围的设备上报数值,输出:0-100范围的Homebridge可识别数值 function convert99To100(input) { const validInput = Math.max(0, Math.min(99, Number(input) ?? 0)); return Math.round(validInput * 100 / 99); }
方案优势
- 边界值完全匹配:0和两个范围的最大值转换结果100%符合两端平台的要求,不会出现最大值无法达到、或者输出非法值的问题
- 误差极小:线性映射加四舍五入的方式,转换误差最大不超过1个单位,对于亮度、音量这类百分比控制场景,用户完全感知不到差异
- 容错性强:内置输入校验逻辑,即便遇到非数值、超出范围的异常消息,也会自动修正到合法范围,不会引发设备或插件报错
内容的提问来源于stack exchange,提问作者SofaKng
相关产品推荐
相关产品推荐

