4

私の実装では、パラメーターを受け入れる関数を 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()、オブジェクトが数字または文字列であることを確認できます。

しかし、整数値と浮動小数点数を区別する必要があります。このテストを実行する最良の方法は何ですか? typeofJSに公開された関数を呼び出す/使用する方法はありますか?

4

3 に答える 3

5

素早い回答

v8::Value::NumberValue()は、精度を失うことなくJavaScript Numberの値を返します。

説明

int64_tdoubleで表現できる数の集合が違うのは事実です。したがって、値が実際にint64_tである場合に何が起こるかについて心配するのは当然です

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

v8::Number とは何ですか?

v8::Number doc を検討してください

詳細な説明

JavaScript 数値 ( ECMA-262、4.3.20 )

IntegerValueint64_tを返しますが、値は倍精度の 64 ビット バイナリ形式 IEEE 754 値として内部的に格納されるため、利用できる精度はなくなります。

ブラウザでのテスト

doubleでは表現できないがint64_t では表現できる値を JavaScript で表現できるかどうかを確認します。

2^63 - 1 は 9223372036854775807 に等しい

JavaScript コンソールで次のように入力してみてください。この値は解析されますが、double では表現できないため、余分な精度は破棄されます。

>9223372036854775807

結果

9223372036854776000
于 2014-08-09T21:14:17.817 に答える
4

または、数値が整数かどうIsInt32かを確認してください。IsUint32()

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

于 2013-06-19T03:01:36.863 に答える
0

この行を使用してみてください。

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

NumberValuedoubleは数値の値を含む を返し、返さ% 1 == 0れた値が 1 で割り切れる場合は true を返します。

于 2013-07-17T17:08:01.133 に答える