zan*_*ngw 4 javascript v8 node.js
我尝试存储一个float通过价值Buffer在Node.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)
然后我发现储值g后readFloatBE()不等于原来的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.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);
Run Code Online (Sandbox Code Playgroud)
似乎没有任何float类型V8,这个设计的任何原因或我错过了什么?在哪种情况下,应该使用此功能writeFloatBE()吗?
似乎
floatV8中没有任何类型
是的,这是设计的:floatJavaScript中也没有类型.所有的数字都是double小号由ECMAScript标准规定.
f因此3.3,您的数字是double精确的,而g只有float精确度.正如你所看到的,那不是一样的f.如果您使用其中一种buf.writeInt…方法,则会发生同样的情况,读取后的结果只会是3这样3.3.
在哪种情况下,应该使用该功能
writeFloatBE()吗?
是的,当然,只要您想float在缓冲区中精确存储数字,就应该使用它.如果要以f完全精度存储,请writeDoubleBE改用.
| 归档时间: |
|
| 查看次数: |
767 次 |
| 最近记录: |