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
。
经过进一步调查,这两个存储的缓冲区值g
和f
是相同的。
> 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.js
或V8
不使用float
types? 请参阅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
似乎没有float
types,这种devise的任何原因,或者我错过了什么? 在这种情况下,应该使用writeFloatBE()
这个函数吗?
V8中似乎没有
float
types
是的,这是devise的:JavaScript中也没有float
types。 所有的数字都是ECMAScript标准规定的 double
。
因此你的数字f
是double
精度的3.3
,而g
只有float
精度。 正如你所看到的,这与f
不一样。 如果你使用了buf.writeInt…
方法之一,读取结果只会是3
而不是3.3
。
在这种情况下,应该使用函数
writeFloatBE()
吗?
是的,当然,应该使用它,只要你想将float
精度的数字存储在缓冲区中。 如果要以完全精度存储f
,请改用writeDoubleBE
。