2015-11-04 60 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");