2015-11-04 109 views
1

這裏是我的代碼轉換詮釋返回NaN

var fifty = prompt("Enter amount "); 
var twenty; 
alert(twenty=parseInt(fifty/50) + " x " + "50 dollar bill"); 
alert(parseInt(twenty/20) + " x " + "20 dollar bill"); 

我試圖計算是百元大鈔。 例如,當我輸入「120」時,它應該返回2x 50張鈔票和1x 20美元鈔票,據我所知,返回的值是字符串類型,所以我將它們轉換爲數字,但在20美元鈔票上它返回「Nan x 20 dollar bils 「我無法理解爲什麼

+2

你'twenty'包含字符串'[數字] + 「X」 + 「50美元的鈔票」' – zvona

+0

是的,但不應該parseInt函數轉換仍然是成多少?據我所知,當轉換字符串數字的一切權利的實際數字被忽略 –

+0

@Jonon這就是'parseInt'做什麼。但是,當瀏覽器首先評估'twenty/20',並且假設你試圖將'string'除以20.它不會調用parseInt,它會使用Nubmer(二十)將它轉換爲數字,並且它變成'NaN '。 Ref:[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)。 – fuyushimoya

回答

0

請注意,我沒有試圖修復這裏的算法,只是輸入錯誤和類型。

你應該首先分析fifty爲int,則只能通過50,除它,因爲你甚至50將可以讓初次parseInt後要一個int。

另外,請注意,parseInt需要一個基數(這裏是10),如果給出了不可分析的值,它仍然可以返回NaN

var fifty = parseInt(prompt("Enter amount "), 10); 
alert(twenty=parseInt(fifty/50, 10) + " x " + "50 dollar bill"); 

作爲替代方案,你可以使用其作用almoste相似,但parseInt(x, 10)時,它會與parseInt返回NaN按位或(|),它將返回0與按位或操作。

使用|

var fifty = prompt("Enter amount ") | 0; 
alert(twenty=((fifty/50)|0) + " x " + "50 dollar bill"); 
0

使用下列內容:

var fifty = prompt("Enter amount "); 
var twenty; 
twenty=parseInt(fifty/50); 
var rem = fifty - (twenty * 50); 
alert(twenty + " x " + "50 dollar bill"); 
alert(parseInt(rem/20) + " x " + "20 dollar bill"); 

希望這將有助於!

0

你的邏輯有問題。

也許這樣的事情: http://jsfiddle.net/2e7cs06v/

var total = prompt("Enter amount "); 
var numOf50=parseInt(total/50); 
var moneyLeft = total - (numOf50 * 50); 
alert(numOf50 + " x " + "50 dollar bill"); 
alert(parseInt(moneyLeft/20) + " x " + "20 dollar bill"); 
+0

你是對的,謝謝 –

+0

不客氣... – Guy

+0

你能告訴我爲什麼我們把NumOf50乘以50? –

1

我已經在你的變量名改組,以使它更清楚一點。

// I'll use the example of 120 to demonstrate 

// The total amount, e.g. 120 
var amount = prompt("Enter amount "); 

// First, convert the inputted string into an int 
var amountAsInt = parseInt(amount, 10); 

// Then, divide by 50 (which equals 2.4), and then use 
// Math.floor() to "chop off" the decimal part 
var numberOfFifties = Math.floor(amountAsInt/50); 
// Leaving us with numberOfFifties = 2 

// We can now use 'modulus' to give the amount left. 
// If you haven't come across modulus before, it gives 
// the remainder after dividing by the given number (here: 50) 
var amountLeft = amount % 50; 

// Do the same with the amount left to find the number of 20s 
var numberOfTwenties = Math.floor(amountLeft/20); 

if(numberOfFifties > 0){alert(numberOfFifties + " x " + "50 dollar bill(s)");} 
if(numberOfTwenties > 0){alert(numberOfTwenties + " x " + "20 dollar bill(s)");} 

的jsfiddle這裏: http://jsfiddle.net/7p57e3u1/3/

原因NaN的

你可以看到爲什麼你看這個的jsfiddle得到一個NaN的原因。

http://jsfiddle.net/pto52oe5/

要設置二十到等於整個字符串,因此它是「非數」(NAN)。

alert(twenty=parseInt(fifty/50) + " x " + "50 dollar bill"); 

在這裏,你似乎是假設

twenty=parseInt(fifty/50) 

將作爲一個獨立的「零件」進行治療,但事實上,它使用的整個表達式,設置twenty是整個字符串即在警報(輸出):

twenty = parseInt(fifty/50) + " x " + "50 dollar bill" 

即(對於上面的例子)

twenty = "2 x 50 dollar bill" 

一個有用的調試技術(以及創建更易於理解且可維護的代碼)是將事情分解成非常簡單的步驟,就像我在上面的示例代碼中所做的那樣。這(可以說)被分解得太過分了,但是用它作爲第一種技術來打破這樣的問題。

+0

你能告訴我爲什麼我們將NumOf50乘以50 –

+0

你不需要2'parseInt'在這裏 - 一旦你已經將輸入解析爲一個int,你不需要再用50除以! – Jamiec

+0

@JhonDhoe我已經更新了代碼,以便更清楚發生了什麼。讓我知道如果你需要更多的澄清 –

0

因爲您已將更多字符串(+「x」+「50美元的鈔票」)解析爲parseInt()函數。所以parseInt函數不能夠解析「美元鈔票」文本值。

var fifty = prompt("Enter amount "); 
var twenty = parseInt(fifty/50); 

alert(twenty + " x " + "50 dollar bill"); 
alert(parseInt(twenty/20) + " x " + "20 dollar bill"); 
1

請停止使用parseInt來分隔float值的整數部分,僅用它將字符串轉換爲整數。當您使用parseInt浮點值被轉換爲字符串並且將某個整數解析回來時,可能會出現浮點數將被轉換爲字符串的情況,如5.1234E-6parseInt在此情況下將返回5。改爲使用Math.floor()

var sum = parseInt(prompt("Enter amount ")); 
var twenty = Math.floor(sum/50); 
alert(twenty + " x " + "50 dollar bill"); 
alert(Math.floor((sum - (twenty*50))/20) + " x " + "20 dollar bill");