這個問題可能是「不尋常的」,但我需要將浮點數Number
轉換爲整數Number
,而不修改其二進制表示。重新解釋將浮點數轉換爲整數
例如,浮點數37.5
由字節0x42160000
(根據IEEE 754)表示。 我需要重新解釋0x42160000
作爲整數,即數字1108738048
我該怎麼做?我在想,可能會有一些按位技巧來實現這個目標?
要清楚,我是而不是正在尋找Math.round
或parseInt
。
這個問題可能是「不尋常的」,但我需要將浮點數Number
轉換爲整數Number
,而不修改其二進制表示。重新解釋將浮點數轉換爲整數
例如,浮點數37.5
由字節0x42160000
(根據IEEE 754)表示。 我需要重新解釋0x42160000
作爲整數,即數字1108738048
我該怎麼做?我在想,可能會有一些按位技巧來實現這個目標?
要清楚,我是而不是正在尋找Math.round
或parseInt
。
Typed arrays可以派上用場: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
被傳遞給一個新的整數數組intArray
。intArray.buffer
也包含值[ 0, 0, 22, 66 ]
。intArray
包含值[ 1108738048 ]
,用其緩衝區計算。我不相信Javascript包含這樣做的任何機制。 Java中有一種方法java.lang.Float.floatBitsToIntBits()
,所以根據您的預期環境,您可能會使用它。如果一切都失敗了,您可能需要將數據發送回服務器進行轉換。另外,我看過嘗試在JavaScript方法來做這種轉換,但從來沒有一個是100%完整和正確的。
那麼,一個不完整的方法總比沒有好。你能告訴我一些嘗試嗎? – Bart
這裏是:http://stackoverflow.com/questions/3077718/converting-a-decimal-value-to-a-32bit-floating-point-hexadecimal/3117567#3117567。儘管主題標題,他顯示在另一個方向的轉換。 –
太棒了。這是所有主流瀏覽器都支持的嗎?我從來沒有聽說過Float32Array或Int32Array ... – Bart
@Bart:其實我不這麼認爲 - 事實上它是全新的。它適用於Chrome - 讓我測試其他瀏覽器。 – pimvdb
@Bart:支持Firefox(至少Firefox 6),Chrome和Safari。不在IE和Opera中恐怕... – pimvdb