如何使用Node.js正确地将64位浮点值截断为32位截断浮点值并返回(降低精度)?

如何使用Node.js正确地将64位浮点值截断为32位截断浮点值并返回(降低精度)?,node.js,floating-point,binary,precision,Node.js,Floating Point,Binary,Precision,因此,显然不存在32位浮点,但是如果我们试图高效地存储大数据,并且我们的许多值都是不大于100000的浮点值,正好有2位小数,那么将64位值存储在32位是有意义的,方法是删除表示我们不需要的精度的位 我试着这样做,只需像这样写入64位BE浮点缓冲区并切片前4个字节: // float32 = Number between 0.00 and 100000.00 const setFloat32 = (float32) => { b64.writeDoubleBE(float32, 0

因此,显然不存在32位浮点,但是如果我们试图高效地存储大数据,并且我们的许多值都是不大于100000的浮点值,正好有2位小数,那么将64位值存储在32位是有意义的,方法是删除表示我们不需要的精度的位

我试着这样做,只需像这样写入64位BE浮点缓冲区并切片前4个字节:

// float32 = Number between 0.00 and 100000.00
const setFloat32 = (float32) => {
    b64.writeDoubleBE(float32, 0) // b64 = 64 bit buffer
    b32 = b64.slice(0, 4)
    return b32;
}
并通过添加4个空字节来读取:

// b32 = the 32 bit buffer from the previous func
const readFloat32 = (b32) => {
    // b32Empty = empty 32 bit buffer
    return Buffer.concat([b32, b32Empty]).readDoubleBE(0);
}
但这个修改后的单位小数如下:

1.85 => 1.8499994277954102
2.05 => 2.049999237060547

如何确定正确的方法,并以最有效的方式提高读取速度?

如果您只想保持两位小数的精度,可以将值转换为移位整数并存储:

function shiftToInteger(val, places) {
    // multiply by a constant to shift the decimals you want to keep into
    // integer positions, then use Math.round() or Math.floor()
    // to truncate the rest of the decimals - depending upon which behavior you want
    // then return the shifted integer that will fit into a U32 for storage
    return Math.round(val * (10 ** places));   
}
这将创建一个移位整数,然后该整数可以存储在32位值中(具有您描述的值限制),例如
uint32阵列
int32阵列
。要在从存储中检索时使用它,您需要将它除以100,将其转换回标准Javascript浮点以供使用

关键是将想要保持的十进制精度转换为整数,这样就可以将其存储在一个非浮点类型的值中,该值的大小刚好可以满足您的最大预期值。您可以提高存储效率,因为您将所有存储位用于所需的精度,而不是在不需要保留的十进制精度上浪费大量不必要的存储位

下面是一个例子:

函数移位到整数(val,places){
返回数学四舍五入(val*(10**位));
}
函数shiftToFloat(整数,位){
返回整数/(10个**位);
}
设x=新UINT32阵列(10);
x[0]=移位整数(1.85,2);
console.log(x[0]);//输出移位整数值
log(shiftToFloat(x[0],2));//转换回十进制值