Переинтерпретировать приведение числа с плавающей запятой к целому - PullRequest
5 голосов
/ 24 сентября 2011

Этот вопрос, вероятно, "необычен", но мне нужно привести число с плавающей точкой Number к целому числу Number без изменения его двоичного представления.

Например, число с плавающей запятой 37.5 представлено байтами 0x42160000 (согласно IEEE 754). Мне нужно переосмыслить 0x42160000 как целое число, то есть число 1108738048

Как мне это сделать? Я думаю, что могут быть некоторые побитовые уловки, чтобы достигнуть этого?

Чтобы было ясно, я не ищу Math.round или parseInt.

Ответы [ 2 ]

5 голосов
/ 24 сентября 2011

Типизированные массивы могут пригодиться здесь: http://jsfiddle.net/rtYrM/.

// create array which is specialized for holding 1 float value
var floatArray = new Float32Array(1);

// set the float value
floatArray[0] = 37.5;

// use its buffer (4 bytes for 1 float) and pass it to an array
// specialized for integers
var intArray = new Int32Array(floatArray.buffer);

// the integer array will interpret the buffer bytes as an integer,
// which seems to be just what you want
intArray[0] === 1108738048; //true

intArray.buffer будет содержать те же байты, что и floatArray.buffer, но без доступа к нему через буферно с самим массивом он будет читать эти байты как тип, указанный типизированным массивом: как целые числа для Int32Array и как числа с плавающей запятой для Float32Array.

В этом случае (в базе 10):

  • floatArray устанавливается на значение [ 37.5 ].
  • floatArray.buffer автоматически устанавливается на значения [ 0, 0, 22, 66 ].
  • floatArray.buffer isпередается в новый целочисленный массив, intArray.
  • intArray.buffer, поэтому содержит также значения [ 0, 0, 22, 66 ].
  • intArray содержит значение [ 1108738048 ], рассчитанное с его буфером.
0 голосов
/ 24 сентября 2011

Я не верю, что Javascript включает какой-либо механизм для этого. В Java есть метод java.lang.Float.floatBitsToIntBits(), поэтому в зависимости от вашей предполагаемой среды вы можете использовать его. Если ничего не помогает, вам, возможно, придется отправить данные обратно на сервер для преобразования. Кроме того, я видел попыток в методах Javascript, чтобы выполнить это преобразование, но ни один из них не был на 100% полным и правильным.

...