2010-09-03 24 views
13
Global.alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront)); 

上面的代碼輸出是這樣的:在JavaScript中添加兩個號碼不正確

base: 15000, upfront: 36, both: 1500036 

爲什麼會加入兩個數字,而不是添加起來的?

我最終想要另一個字段的值設置爲使用此此量:

mainPanel.feesPanel.initialLoanAmount.setValue(Ext.util.Format.number((base + upfront), '$0,000.00')); 

當我嘗試,它把數以百萬的,而不是15,036.00。爲什麼?

回答

10

這可能是因爲它們是字符串而發生的。試試把它們解析:

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base) + parseInt(upfront)) 
); 

如果這些數字是小數,你將需要parseFloat方法來代替。

+5

-1應該指定基數arg爲parseInt – goat 2011-01-07 22:10:11

1

它將它作爲一個字符串處理。你需要在字符串前進行數學運算。例如:

base + upfront + ' string' 

會返回「15036字符串」。

string + base + upfront 

將返回字符串1500036,因爲你現在看到。

或使用parseInt()

+0

他使用括號,因此在嘗試與其他字符串合併之前執行添加(即,如果使用括號,則不必在「字符串之前」執行數學運算) 。但是,parseInt會起作用 - ** + **操作符將至少一個操作數視爲字符串。 – palswim 2010-09-03 19:15:35

6

嘗試

Global.alert(
    "base: " + base + ", upfront: " + upfront + ", both: " + 
    (parseInt(base,10) + parseInt(upfront,10)) 
); 

的10指定底座10,否則該值的機會被解析爲八進制存在。

+0

只是一個小小的問題 - 雖然你總是指定基礎是一個好主意,但默認的基礎確實是10而不是八進制。它假定八個字符串從零開始(如「0120」)。 – 2010-09-03 17:49:01

+0

因此,從「否則它是八進制」變爲「否則值被解析爲八進制存在的機會」將是一個很好的編輯?這都是關於最佳實踐的,對嗎? – davidj 2010-09-03 17:52:16

+0

用於指定基數的+1 – goat 2011-01-07 22:11:00

1

我不知道爲什麼括號不會幫助你。
如果我嘗試

var base = 500; 
var upfront = 100; 
alert("base: " + base + ", upfront: " + upfront + ", both: " + (base + upfront)) 

我得到600的答案,所以它可能是有什麼東西在Global.alert功能怎麼回事?

語言設計的一個錯誤是+既是一個加法運算符,也是一個串聯運算符。再加上事實上它是鬆散的類型,並且隱含地意味着它會給你一些令人討厭的驚喜,除非你採取措施確保你真的添加了數字而不是串聯字符串。在這種情況下,它會將您的base + upfront作爲字符串並因此連接起來。

無論如何,繞過它的方式可能是改爲(base - upfront*-1)

21

簡單的例子:

1 +1 == 2 
"1"+1 == "11" 
"1"*1 + 1 == 2 

途徑把字符串轉換成一個數:

  • parseInt(str)
  • parseInt(str,10)
  • parseFloat(str)
  • +str
  • str*1
  • str-0
  • str<<0
  • Number(str)

這裏有一些後果: Results of converting various strings using the above techniques http://phrogz.net/JS/string_to_number.png

Number(str)具有相同的行爲str*1,但需要一個函數調用。

我個人使用*1,因爲它很短,但仍然很突出(不像一元+),並且給我什麼用戶輸入或完全失敗。我只使用parseInt()當我知道將在最後有非數字內容忽略,或者當我需要解析非基10字符串。

您可以在瀏覽器中測試這些性能at my example page

+0

+1,'+ s'和's * 1'不僅是shorthands,而且更正確。 – 2011-01-05 04:19:46

+0

+1,用於說明字符串爲num – kjy112 2011-02-09 18:38:33

+0

+1。我會補充說'Number()'也可以給你奇怪的結果。例如,'+「」'和'+「」'將產生'0',其中'parseInt(「」,10)'將返回'NaN'。 'Number()'在轉換之前修剪空白區域,修剪後的空字符串總是會產生'0'。像其他方法起起落落一樣,這種行爲是否合乎需要可能因使用情況而異。通常情況下,我使用'+'(它對我來說足夠突出),但絕對值得確保你不會被機器中的鬼魂看到。 – 2011-09-15 16:54:32