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

zan*_*ngw 4 javascript v8 node.js

我尝试存储一个float通过价值BufferNode.js

> f = 3.3
3.3
> var buf = new Buffer(32)
> buf.writeFloatBE(f);
4
> g = buf.readFloatBE();
3.299999952316284
Run Code Online (Sandbox Code Playgroud)

然后我发现储值greadFloatBE()不等于原来的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>
Run Code Online (Sandbox Code Playgroud)

根据这个Buffer读写浮点数,我们知道writeDoulbeBE应该在这里使用.

> var buf3 = new Buffer(8);
> buf3.writeDoubleBE(f);
8
> h = buf3.readDoubleBE();
3.3
> h === f
true
Run Code Online (Sandbox Code Playgroud)

我想知道为什么float不使用这种类型Node.jsV8?请参阅代码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);
Run Code Online (Sandbox Code Playgroud)

似乎没有任何float类型V8,这个设计的任何原因或我错过了什么?在哪种情况下,应该使用此功能writeFloatBE()吗?

Ber*_*rgi 5

似乎floatV8中没有任何类型

是的,这是设计的:floatJavaScript中也没有类型.所有的数字都是double小号由ECMAScript标准规定.

f因此3.3,您的数字是double精确的,而g只有float精确度.正如你所看到的,那不是一样的f.如果您使用其中一种buf.writeInt…方法,则会发生同样的情况,读取后的结果只会是3这样3.3.

在哪种情况下,应该使用该功能writeFloatBE()吗?

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