Node.js/V8中没有真正的float类型?
There is no real float type in Node.js/V8?
我尝试通过 Buffer
在 Node.js
中存储一个 float
值
> f = 3.3
3.3
> var buf = new Buffer(32)
> buf.writeFloatBE(f);
4
> g = buf.readFloatBE();
3.299999952316284
然后我发现readFloatBE()
后的存储值g
不等于原来的f
。
进一步调查后,存储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 reading and writing floats,我们知道这里应该使用writeDoulbeBE
。
> var buf3 = new Buffer(8);
> buf3.writeDoubleBE(f);
8
> h = buf3.readDoubleBE();
3.3
> h === f
true
我想知道为什么float
类型没有在Node.js
或V8
中使用?参考V8
中的code
// 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
类型,这种设计有任何原因还是我遗漏了什么?在什么情况下,应该使用这个函数writeFloatBE()
?
It seems there is NO float
type in V8
是的,这是设计使然:JavaScript 中也没有 float
类型。 所有数字都是double
s as specified by the ECMAScript standard.
因此,您的数字 f
是 3.3
,精度为 double
,而 g
的精度仅为 float
。如您所见,这与 f
不同。如果您使用 buf.writeInt…
方法之一,也会发生同样的情况,读取后的结果只会是 3
而不是 3.3
.
In which case, should the function writeFloatBE()
be used?
是的,只要您想在缓冲区中存储 float
精度的数字,当然应该使用它。如果您想以完全精确的方式存储 f
,请改用 writeDoubleBE
。
我尝试通过 Buffer
在 Node.js
float
值
> f = 3.3
3.3
> var buf = new Buffer(32)
> buf.writeFloatBE(f);
4
> g = buf.readFloatBE();
3.299999952316284
然后我发现readFloatBE()
后的存储值g
不等于原来的f
。
进一步调查后,存储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 reading and writing floats,我们知道这里应该使用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);
似乎 V8
中没有 float
类型,这种设计有任何原因还是我遗漏了什么?在什么情况下,应该使用这个函数writeFloatBE()
?
It seems there is NO
float
type in V8
是的,这是设计使然:JavaScript 中也没有 float
类型。 所有数字都是double
s as specified by the ECMAScript standard.
因此,您的数字 f
是 3.3
,精度为 double
,而 g
的精度仅为 float
。如您所见,这与 f
不同。如果您使用 buf.writeInt…
方法之一,也会发生同样的情况,读取后的结果只会是 3
而不是 3.3
.
In which case, should the function
writeFloatBE()
be used?
是的,只要您想在缓冲区中存储 float
精度的数字,当然应该使用它。如果您想以完全精确的方式存储 f
,请改用 writeDoubleBE
。