2011-09-24 16 views
5

To pytanie jest prawdopodobnie "nietypowe", ale muszę rzucić liczbę zmiennoprzecinkową Number na liczbę całkowitą Number, bez modyfikowania jej reprezentacji binarnej.Nowa interpretacja rzutowania liczby zmiennopozycyjnej na liczbę całkowitą

Na przykład float 37.5 jest reprezentowany przez bajty 0x42160000 (zgodnie z IEEE 754). Muszę ponownie interpretować 0x42160000 jako liczbę całkowitą, tj. Numer 1108738048

Jak to zrobić? Sądzę, że może to być trochę sztuczek, aby to osiągnąć?

Dla jasności, jestem nie poszukuję Math.round lub parseInt.

Odpowiedz

5

Typed arrays może się przydać tutaj: 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 będzie posiadać te same bajty jako floatArray.buffer, ale przez nie dostępu do niego buforem ale z samej tablicy, będzie czytać te bajty jako typ określony przez wpisywanych tablicy: jako liczby całkowite dla Int32Array i jako pływaki dla Float32Array.

W tym przypadku (o podstawie 10)

  • floatArray jest ustawiony na wartość [ 37.5 ].
  • floatArray.buffer jest automatycznie ustawiana na wartości [ 0, 0, 22, 66 ].
  • floatArray.buffer jest przekazywana do nowej tablicy liczb całkowitych, intArray.
  • intArray.buffer dlatego zawiera również wartości [ 0, 0, 22, 66 ].
  • intArray zawiera wartość [ 1108738048 ], obliczoną za pomocą bufora.
+0

Awesome. Czy jest to obsługiwane przez wszystkie główne przeglądarki? Nigdy nie słyszałem o Float32Array lub Int32Array ... – Bart

+0

@Bart: Tak naprawdę nie sądzę - jest zupełnie nowy. Działa w Chrome - pozwól mi przetestować dla innych przeglądarek. – pimvdb

+0

@Bart: Obsługa w przeglądarce Firefox (przynajmniej Firefox 6), Chrome i Safari. Nie w IE ani w Operze, obawiam się ... – pimvdb

0

Nie wierzę, JavaScript obejmuje dowolny mechanizm do tego. W Javie jest metoda java.lang.Float.floatBitsToIntBits(), więc w zależności od zamierzonego środowiska możesz z niej skorzystać. Jeśli wszystko inne zawiedzie, być może będziesz musiał wysłać dane z powrotem do serwera, aby je przekonwertować. Alternatywnie, widziałem prób metod JavaScript do tej konwersji, ale nigdy nie był w 100% kompletny i poprawny.

+0

Cóż, niepełna metoda jest lepsza niż żadna. Czy możesz pokazać mi jakieś próby? – Bart

+1

Jest to: http://stackoverflow.com/questions/3077718/converting-a-decimal-value-to-a-32bit-floating-point-hexadecimal/3117567#3117567. Pomimo tytułu wątku pokazuje konwersję w innym kierunku. –

Powiązane problemy