Node.js / V8中没有真正的浮点类型?

时间:2015-11-20 09:42:23

标签: javascript node.js v8

我尝试在[{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()

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

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

中的code
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

1 个答案:

答案 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