- 作(zuò)者:admin
- 發表時(shí)間(jiān):2013-07-02 14:17:29
- 來(lái)源:未知
JavaScript 是弱類型語言,為(wèi)了保證數(shù)值的有(yǒu)效性,在處理(lǐ)數(shù)值的時(shí)候,我們可(kě)以對數(shù)值字符串進行(xíng)強行(xíng)轉換。如 parseInt 取整和(hé) parseFloat 取浮點數(shù)。
Java 也有(yǒu) Integer.parseInt() 方法,但(dàn)是 JavaScript 的 parseInt 處理(lǐ)方式與 Java 等強整型語言不太一樣,所以經常有(yǒu)人(rén)因為(wèi)對這個(gè)方法的使用不當而獲得(de)異常返回。
下面是一段 Java 代碼,用于将字符串 020 轉為(wèi)整型。
public class Test { public static void main(String args[]) throws Exception { String str = "020"; System.out.println(Integer.parseInt(str)); } }
輸出結果是 20
下面是一段 JavaScript 代碼,同樣是将字符串 020 轉為(wèi)整型。
var str = "020"; var num = parseInt(str); alert(num);
輸出結果是 16
為(wèi)什麽呢?
無論是 Java 還(hái)是 JavaScript,parseInt 方法都有(yǒu)兩個(gè)參數(shù),第一個(gè)參數(shù)就是要轉換的對象,第二個(gè)參數(shù)是進制(zhì)基數(shù),可(kě)以是 2,8,10,16,默認以 10 進制(zhì)處理(lǐ)。但(dàn)在 JavaScript 中,0 開(kāi)始的數(shù)被認為(wèi)使用 8 進制(zhì)處理(lǐ),0x 的數(shù)被認為(wèi)是用 16 進制(zhì)來(lái)處理(lǐ)。所以上(shàng)面的 JavaScript 代碼計(jì)算(suàn)錯誤了。
影(yǐng)響大(dà)嗎?
大(dà)! 很(hěn)大(dà)! 因為(wèi)這個(gè)經常用于計(jì)算(suàn)價錢(qián),一旦價格錯誤,對用戶來(lái)說,這是誤導,而一個(gè)好的網站(zhàn)不應該出現這種誤導用戶的。下面的 DEMO 中,沒有(yǒu)指定進制(zhì)。大(dà)家(jiā)可(kě)以在數(shù)量框中輸入一個(gè)以 0 開(kāi)頭的數(shù)字,在點擊計(jì)算(suàn)按鈕,算(suàn)出來(lái)的數(shù)值将比預想中的小(xiǎo)一些(xiē),或者小(xiǎo)很(hěn)多(duō) (如: 8 進制(zhì)中沒有(yǒu) 019 這樣的數(shù)值,所以數(shù)值變成了 1,9 被忽略掉)。
如何修改?
前面說過,有(yǒu)兩個(gè)參數(shù),第二個(gè)參數(shù)可(kě)以指定計(jì)算(suàn)使用的進制(zhì)。
parseInt(num,radix);
所以我們可(kě)以将前面有(yǒu)問題的那(nà)段 JavaScript 代碼改寫為(wèi)下面的代碼。
var str = "020"; var num = parseInt(str,10); alert(num);
記住了,在 JavaScript 上(shàng)使用 parseInt 方法時(shí)要帶上(shàng)進制(zhì)參數(shù)。