我尝试在[{1}}
中通过float
存储一个Buffer
值
Node.js
然后我发现> f = 3.3
3.3
> var buf = new Buffer(32)
> buf.writeFloatBE(f);
4
> g = buf.readFloatBE();
3.299999952316284
后的存储值g
不等于原始readFloatBE()
。
经过进一步调查后,存储f
和g
的两个缓冲区值相同。
f
根据此Buffer reading and writing floats,我们知道此处应使用> 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>
。
writeDoulbeBE
我想知道为什么> var buf3 = new Buffer(8);
> buf3.writeDoubleBE(f);
8
> h = buf3.readDoubleBE();
3.3
> h === f
true
或float
中没有使用Node.js
类型?请参阅V8
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);
中没有float
类型,这个设计的任何原因或我错过了什么?在这种情况下,是否应该使用此函数V8
?
答案 0 :(得分:5)
似乎V8中没有
float
类型
是的,这是设计的:JavaScript中也没有float
类型。 所有数字均为double
s as specified by the ECMAScript standard。
您的号码f
因此3.3
具有double
精度,而g
只有float
精度。如您所见,这与f
不同。如果您使用其中一种buf.writeInt…
方法,也会发生同样的情况,阅读后的结果只会是3
而不是3.3
。
在哪种情况下,是否应该使用函数
writeFloatBE()
?
是的,当然,只要您想在缓冲区中存储float
精度的数字,就应该使用它。如果您想要完全精确地存储f
,请改用writeDoubleBE
。