转换后的Int返回NaN

时间:2015-11-04 11:45:03

标签: javascript

这是我的代码

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”时它应该返回2x50票据和1x20美元票据,我知道返回的值是字符串类型所以我将它们转换为数字,但是在20美元的钞票上它返回“Nan x 20 dollar bils”我无法理解为什么

6 个答案:

答案 0 :(得分: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设置为alert()中输出的整个字符串:

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

即。 (对于上面的例子)

twenty = "2 x 50 dollar bill"

调试(以及创建更易理解且可维护的代码)的有用技术是将事情分解为非常简单的步骤,就像我在上面的示例代码中所做的那样。这个(可以说)被分解得太过分了,但是把它作为解决这类问题的第一种技术。

答案 1 :(得分:1)

请停止使用parseInt分隔浮点值的整数部分,仅将其用于将字符串转换为整数。当您使用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");

答案 2 :(得分:0)

请注意,我并未尝试在此修复算​​法,只是输入错误和类型。

您应首先将fifty解析为int,然后只将其除以50,因为即使在除以50之后您想要一个int,您也可以让parseInt初始化NaN }。

另外,请注意parseInt需要一个基数(此处为10),如果给出了不可解析的值,它仍然可以返回var fifty = parseInt(prompt("Enter amount "), 10); alert(twenty=parseInt(fifty/50, 10) + " x " + "50 dollar bill");

|

作为替代方案,你可以使用按位或(parseInt(x, 10))行为almoste,如NaN,除非它返回parseInt 0时,它会使用按位或运算符返回|

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

{{1}}

答案 3 :(得分: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");

希望它会有所帮助!!

答案 4 :(得分: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");

答案 5 :(得分: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");