在V8中区分整数和双精度

时间:2013-06-12 08:28:28

标签: c++ c++11 v8

在我的实现中,我为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 
  }
}

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

但现在我需要区分整数值和浮点数。执行此测试的最佳方法是什么?有没有办法调用/使用公开给JS的typeof函数?

3 个答案:

答案 0 :(得分:4)

请尝试IsInt32IsUint32()检查号码是否为整数。

https://github.com/v8/v8/blob/master/include/v8.h#L1313

答案 1 :(得分:3)

快速回答

v8 :: Value :: NumberValue()将返回javascript Number 的值,而不会损失精度。

说明

确实, int64_t double 所代表的数字集是不同的。如果值实际上是 int64_t ,那么自然会关注会发生什么,因为v8 :: Value定义了两者

V8EXPORT int64_t v8::Value::IntegerValue() const;
V8EXPORT double v8::Value::NumberValue() const;

什么是v8 :: Number?

考虑v8 :: Number doc

  
    

详细说明

         

JavaScript编号值(ECMA-262, 4.3.20

  

IntegerValue 会返回 int64_t ,但会有no more precision available,因为该值在内部存储为双精度64位二进制格式IEEE 754值。

在浏览器中测试

检查javascript是否可以代表 double 所不能的值,但 int64_t 可以。< / p>

  

2 ^ 63 - 1等于9223372036854775807

尝试在javascript控制台中输入以下内容;这个值被解析但是额外的精度被抛弃了,因为double不能代表它。

>9223372036854775807

结果

9223372036854776000

答案 2 :(得分:0)

尝试使用此行;

bool isInt = ( num->NumberValue() ) % 1 == 0;

NumberValue返回带有数字值的double,如果返回的值可以被1整除,则% 1 == 0将返回true。