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

标签 javascript node.js v8

我尝试在 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

经过进一步调查,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

我想知道为什么 node.jsV8 中没有使用 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 .

因此,您的数字 f3.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/

相关文章:

javascript - 无法连接到 Node js中的websocket

javascript - 使用 MongoDB 和 Nodejs 插入和查询日期

javascript - Android 的 JNI JavaScript 绑定(bind)是否有效地将 TypedArray/ArrayBuffer 作为数组传递给 Java?

javascript - V8 中动态对象访问如何工作?

javascript - 如何避免旋转时自动左对齐?

javascript - React Native ,自动更新 .js 文件

javascript - 无法在此代码中获取 this.value

node.js - 将新的 Mongoose 中间件前提条件应用于集合中所有现有的元素

node.js - 如果是为了告诉包和模块的入口点,为什么我们需要 Node 应用程序根目录下的 package.json 中的 main 属性?

javascript - 为什么我的 8 拼图解决方案在我创建两次数组时运行得更快