Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在V8中区分整数和双精度_C++_C++11_V8 - Fatal编程技术网

C++ 在V8中区分整数和双精度

C++ 在V8中区分整数和双精度,c++,c++11,v8,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->Is

在我的实现中,我向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 
  }
}
v8::Handle TableGetValueIdForValue(常量v8::参数和参数){
v8::Isolate*Isolate=v8::Isolate::GetCurrent();
v8::手柄镜手柄镜(隔离);
自动val=args[1];
如果(val->IsNumber()){
自动编号=val->ToNumber();
//如何检查Int还是Double
}否则{
//val==字符串
}
}
现在这个参数基本上可以有任何类型。由于我支持Int、Float和String,所以我希望有效地检查这些类型。使用
IsNumber()
IsStringObject()
我可以确保对象是数字或字符串


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

尝试
IsInt32
IsUint32()
检查数字是否为整数

尝试使用这一行

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

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

快速回答 v8::Value::NumberValue()将返回javascript数字的值,而不会丢失精度

解释 确实,int64_tdouble表示的数字集是不同的。如果值实际上是int64\u t,那么很自然地会担心会发生什么,因为v8::value定义了这两个值

V8EXPORT int64_t v8::Value::IntegerValue() const;
V8EXPORT double v8::Value::NumberValue() const;
什么是v8::数字? 考虑v8::Number文档

详细说明 JavaScript数字值()

IntegerValue确实返回一个int64_t,但会返回,因为该值在内部存储为双精度64位二进制格式IEEE 754值

在浏览器中测试 检查javascript是否可以表示一个double不能表示的值,而int64\t可以表示的值

2^63-1等于9223372036854775807

尝试在javascript控制台中键入以下内容;该值已被解析,但由于double不能表示它,因此额外的精度被丢弃

>9223372036854775807
结果

9223372036854776000

在中搜索“类值”。有一些函数
bool Value::IsInt32
double Value::NumberValue
可能会很有趣。谢谢,这是真的,但是这里有一个小问题:如果您查看中方法的实现,您将看到它首先检查
IsSmi()
(小整数)然后进一步检查双精度表示是否可以前后转换为整数,以查看该值是否稳定。因此,像
3.0
这样的值将被视为整数,即使它是一个
数字
。对此有何评论?就JavaScript语义而言,3.0是一个整数。V8是否在内部将其表示为浮点是一个实现细节,这就是谓词按原样实现的原因。我通过47作为参数,但IsInt32返回false。有人有什么想法吗?@jessepper IsUint32也返回false?你在函数中传递了什么值<代码>foo(42)
?或者
foo(“42”)
v8::Value::NumberValue()将返回javascript数字的值,而不会丢失精度。
这有助于我添加到已定义的双精度中,谢谢