在V8中区分整数和双精度

gru*_*zip 4 c++ v8 c++11

在我的实现中,我为JavaScript提供了一个接受参数的函数。

v8::Handle<v8::Value> TableGetValueIdForValue(const v8::Arguments& args) {
  v8::Isolate* isolate = v8::Isolate::GetCurrent();
  v8::HandleScope handle_scope(isolate);

  auto val = args[1];

  if (val->IsNumber()) {

    auto num = val->ToNumber();
    // How to check if Int or Double    

  } else { 
     // val == string 
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,此参数基本上可以具有任何类型。当我支持Int,Float和String时,我想有效地检查这些类型。使用IsNumber()IsStringObject()我可以确保对象是数字或字符串。

但是现在我需要区分整数值和浮点数。进行此测试的最佳方法是什么?有没有一种方法可以调用/使用typeof暴露给JS 的函数?

waT*_*eim 5

快速回答

v8 :: Value :: NumberValue()将返回javascript Number的值而不会降低精度。

说明

的确,由int64_tdouble表示的数字集是不同的。因此很自然地担心如果值实际上是int64_t会发生什么,因为v8 :: Value定义了两者

V8EXPORT int64_t v8::Value::IntegerValue() const;
V8EXPORT double v8::Value::NumberValue() const;
Run Code Online (Sandbox Code Playgroud)

什么是v8 :: Number?

考虑v8 :: Number文档

详细说明

JavaScript数字值(ECMA-262,4.3.20

IntegerValue确实返回int64_t,但是将没有其他精度可用,因为该值在内部存储为双精度64位二进制格式IEEE 754值。

在浏览器中测试

检查javascript是否可以代表double不能但int64_t可以的值。

2 ^ 63-1等于9223372036854775807

尝试在javascript控制台中键入以下内容;会解析此值,但会丢弃多余的精度,因为double无法表示它。

>9223372036854775807
Run Code Online (Sandbox Code Playgroud)

结果

9223372036854776000
Run Code Online (Sandbox Code Playgroud)