我尝试在 Node.js
中通过 Buffer
存储一个 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
我想知道为什么 node.js
或 V8
中没有使用 float
类型?引用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);
在 V8
中似乎没有 float
类型,这种设计有任何原因还是我遗漏了什么?在这种情况下,应该使用此函数 writeFloatBE()
吗?
最佳答案
It seems there is NO
float
type in V8
是的,这是设计使然:JavaScript 中也没有 float
类型。 所有数字 都是double
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
相反。
关于javascript - Node.js/V8 中没有真正的 float 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33823435/