Как проверить значение napi_value типа napi_number - это целое или десятичное число с помощью функции N-API node.js, - PullRequest
0 голосов
/ 28 октября 2019

Как проверить заданное napi_value типа napi_number - это целое число или десятичное число (число с дробным значением) с помощьюnode.js нативная функция N-API. Похоже, что в N-API нет эквивалентной функции isInt () или isDouble () (мы также не хотим использовать вызов функции V8). Давайте рассмотрим сценарий, в котором мы вызываем нативную аддонную функцию f1 () из JavaScript, передавая объект JavaScript в качестве аргумента, как показано во фрагменте.

let obj = { n1: 123, n2: 123.45 };
myaddon.f1( obj );

Нативная функция f1 () хочет извлечь значение, связанное с ключами n1 и n2 , вызвав функцию N-API для извлечения оптимального значения. Например, для извлечения значения n1 может быть лучше использовать один из napi_get_value_int * и аналогично для n2 значение double являетсялучший выбор

napi_get_value_double
napi_get_value_int32
napi_get_value_uint32
napi_get_value_int64

К сожалению, я не смог найти ни одной функции N-API для проверки производной свойства napi_number . Сталкивались ли вы с подобной ситуацией, если да, то как вы решили эту проблему?

https://nodejs.org/api/n-api.html

1 Ответ

0 голосов
/ 30 октября 2019

Был открыт запрос с командой node-addon-api относительно этой функции, и они дали ответ, который звучит логично. Я думал о том, чтобы поделиться ответом с этим сообществом, которое может помочь подобным запросам, которые могут возникнуть у других. Вот ответ от команды node-addon-api

При обработке чисел с помощью JavaScript важно знать, что все числа в JavaScript являются *648-битные значения IEEE 754 двойной точности с двойной точностью (несмотря на то, что некоторые механизмы, такие как v8, могут иметь дополнительные представления для маленьких целых чисел, в спецификации ECMA нет такого определения и нет способа определить эти типы чисел в JavaScript).

napi_get_value_ {double, int32, uint32, int64} просто конвертируют эти значения в желаемое. Там может быть потеря точности в преобразовании. Если в этом случае требуется определенное число, используйте вместо него BigInt.

...