如何在JS中将两个f64打包为i64通过TradingView API传输并还原?
JS实现多数值打包到TradingView K线字段的方案
打包流程(f64 → f32 → i32 → i64)
利用JS的TypedArray直接操作二进制内存,完成类型转换与打包:
// 打包两个64位浮点数为一个64位整数(BigInt) function packTwoF64ToI64(num1, num2) { // 1. f64转f32:通过Float32Array自动截断精度 const f32Buffer = new Float32Array([num1, num2]); // 2. f32转i32:解析f32的二进制位为32位整数 const i32Buffer = new Int32Array(f32Buffer.buffer); const i32High = i32Buffer[0]; const i32Low = i32Buffer[1]; // 3. 打包为i64 BigInt:处理符号位后拼接高低32位 const highBigInt = BigInt(i32High) & 0xFFFFFFFFn; const lowBigInt = BigInt(i32Low) & 0xFFFFFFFFn; return (highBigInt << 32n) | lowBigInt; }
解包流程(i64 → i32 → f32 → f64)
逆向操作还原原始数值:
// 从64位整数(BigInt)解包出两个64位浮点数 function unpackI64ToTwoF64(packedBigInt) { // 1. 拆分i64为两个i32 const highI32 = Number((packedBigInt >> 32n) & 0xFFFFFFFFn); const lowI32 = Number(packedBigInt & 0xFFFFFFFFn); // 2. i32转f32:解析整数的二进制位为32位浮点数 const i32Buffer = new Int32Array([highI32, lowI32]); const f32Buffer = new Float32Array(i32Buffer.buffer); // 3. f32转f64:直接返回JS原生Number(即f64) return [f32Buffer[0], f32Buffer[1]]; }
测试示例
// 模拟交易场景数值 const price1 = 150.75; const volume1 = 2450.3; const price2 = 151.2; const volume2 = 1890.5; // 打包两组数值 const packed1 = packTwoF64ToI64(price1, volume1); const packed2 = packTwoF64ToI64(price2, volume2); // 构造TradingView K线数组(时间+5个打包值,此处仅展示2个) const kline = [1699996800000, packed1, packed2, /* 剩余3组打包数值 */]; // 回调中解包还原 const [unpackedPrice1, unpackedVolume1] = unpackI64ToTwoF64(kline[1]); const [unpackedPrice2, unpackedVolume2] = unpackI64ToTwoF64(kline[2]); console.log('原始价格1:', price1, '解包后:', unpackedPrice1); console.log('原始成交量1:', volume1, '解包后:', unpackedVolume1);
注意事项
- BigInt兼容性:若TradingView API不支持BigInt作为字段值,需确认打包后的i64是否在JS Number的安全范围(
2^53 - 1)内。交易场景下的价格、成交量转f32后,打包结果通常不会超出该范围;极端值可考虑拆分i64为两个32位Number(但会占用额外字段)。 - 精度损失:f64转f32必然损失精度,此为符合需求的前提,损失程度取决于原始数值的小数位数与范围。
- 字节序问题:TypedArray使用平台原生字节序,因打包和解包在同一环境执行,无需额外处理。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

