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

There is no real float type in Node.js/V8?

我尝试通过 BufferNode.js

中存储一个 float
> f = 3.3
3.3
> var buf = new Buffer(32)
> buf.writeFloatBE(f);
4
> g = buf.readFloatBE();
3.299999952316284

然后我发现readFloatBE()后的存储值g不等于原来的f

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

> 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.jsV8中使用?参考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 类型。 所有数字都是doubles as specified by the ECMAScript standard.

因此,您的数字 f3.3,精度为 double,而 g 的精度仅为 float。如您所见,这与 f 不同。如果您使用 buf.writeInt… 方法之一,也会发生同样的情况,读取后的结果只会是 3 而不是 3.3.

In which case, should the function writeFloatBE() be used?

是的,只要您想在缓冲区中存储 float 精度的数字,当然应该使用它。如果您想以完全精确的方式存储 f,请改用 writeDoubleBE