Node.js / V8中没有实际的浮点types?

我尝试在Node.js通过Buffer存储一个float

 > f = 3.3 3.3 > var buf = new Buffer(32) > buf.writeFloatBE(f); 4 > g = buf.readFloatBE(); 3.299999952316284 

然后,我发现readFloatBE()不等于原来的f后,存储的值为g

经过进一步调查,这两个存储的缓冲区值gf是相同的。

 > var buf1 = new Buffer(4); buf1.writeFloatBE(f); buf1 <Buffer 40 53 33 33> > var buf2 = new Buffer(4); buf2.writeFloatBE(g); buf2 <Buffer 40 53 33 33> 

根据这个Buffer的读写浮点数 ,我们知道writeDoulbeBE应该在这里使用。

 > var buf3 = new Buffer(8); > buf3.writeDoubleBE(f); 8 > h = buf3.readDoubleBE(); 3.3 > h === f true 

我想知道为什么在Node.jsV8不使用floattypes? 请参阅V8的代码

  // Fast primitive setters V8_INLINE void Set(bool value); V8_INLINE void Set(double i); V8_INLINE void Set(int32_t i); V8_INLINE void Set(uint32_t i); 

V8似乎没有floattypes,这种devise的任何原因,或者我错过了什么? 在这种情况下,应该使用writeFloatBE()这个函数吗?

V8中似乎没有floattypes

是的,这是devise的:JavaScript中也没有floattypes。 所有的数字都是ECMAScript标准规定的 double

因此你的数字fdouble精度的3.3 ,而g只有float精度。 正如你所看到的,这与f不一样。 如果你使用了buf.writeInt…方法之一,读取结果只会是3而不是3.3

在这种情况下,应该使用函数writeFloatBE()吗?

是的,当然,应该使用它,只要你想将float精度的数字存储在缓冲区中。 如果要以完全精度存储f ,请改用writeDoubleBE