C++ 在V8中区分整数和双精度
在我的实现中,我向JavaScript提供了一个接受参数的函数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
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_t和double表示的数字集是不同的。如果值实际上是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数字的值,而不会丢失精度。
这有助于我添加到已定义的双精度中,谢谢