我正在尝试构建一个带有2个小数点的价格并找到下一个最高回文的函数。我知道还有其他几种方法可以解决这个问题,但我很好奇为什么我的方法不起作用。我是JS的新手,所以这可能很简单。任何建议都会很棒。
我把它分成了小块,并解释了我想要它在下面做什么:
var ask = prompt("Enter a price");
var reverseIt = function (x) {
x = (parseFloat(x) * 100).toString();
for (var i = (x.length - 1); i >= 0; i--) {
x.substr(i, 1);
}
return
};
reverseIt 函数接受一个参数删除小数(* 100)并反转该数字。
var removeDec = function (j) {
return (parseFloat(j) * 100).toString();
}
removeDec 函数接受一个参数,删除小数点(* 100),并将其转换回字符串。这比较两个“数字”字符串是多余的吗?我应该使用 Number()和 String()功能吗?
var findDrome = function (i) {
for (var i; removeDec(i) != reverseIt(i); i += (1 / 100)) {
if ((removeDec(i) + 1).toString() == reverseIt(i)) {
document.write(i + (1 / 100));
}
} return
};
findDrome(ask);
findDrome函数将start的ask提示作为参数。如果没有小数的数字与没有小数的反向不匹配,则将其递增0.01。在循环结束之前,我希望它检查前+1的数字(因为它是* 100)是否等于反向,如果是,则写下一个数字。
它没有用,所以我尝试添加parseFloat和toString来指定更严格/更明确的转换。我也使用了松散的相等运算符,但它仍然无效。
我的问题:这是转换或语法问题还是你不能比较2个函数的输出?我应该比较2个变量,如果是,我如何将 reverseIt 函数中的for循环分配给变量?
答案 0 :(得分:0)
您的计划存在许多问题。首先,您的reverseIt
函数永远不会返回反转值。传递变量x
但它永远不会在for
循环中更新 - x.substr()
创建一个新的字符串实例,但它永远不会被分配回x
,因此它的值永远不会改变。事实上,for
中的findDrome
循环变为无限,因为reverseIt
返回undefined
。
另一个可能的问题是你将浮点数增加1/100
,但浮点值没有精确的表示。我不知道这是否真的影响了你的代码(因为它目前永远不会返回正确的值)但是你可能不得不担心。这可能会影响parseFloat
(可能会返回与其解析的字符串略有不同的浮点值)。
使用toFixed()会将数字截断为2位小数。然后,您可以将数字转换为字符串并删除小数点字符,而不是在字符串和数字之间来回转换数字。
您可能需要阅读floating-point arithmetic(如果您还不熟悉它)。
作为最后一条评论,您应该从不依赖于Javascript来终止您的语句 - 您应该始终使用;
来终止语句,就像其他正确的C风格语言一样。离开;
- s(即使Javascript让你逃脱它)被认为是非常糟糕的做法。
答案 1 :(得分:0)
感谢上面的帮助,我想通了!以下是固定程序的工作原理:
var ask = prompt("Enter a price to find the next palindromic price");
var removeDec = function (j) {
return parseInt(j * 100);
};
var c = removeDec(ask);
这会提示价格并将其乘以100以移除小数点并避免浮点运算。 parseInt 会删除小于百分位数的任何小数。
var reverseIt = function (x) {
var a = ""
x = x.toString();
for (var i = (x.length - 1); i >= 0; i--) {
a = (a + String(x.substr(i, 1)));
}
return Number(a);
};
var b = reverseIt(c);
reverseIt 函数接受一个参数,将其转换为字符串,并将每个字符反向添加到空字符串(a =“”)。然后将 Var a 作为数字返回。空字符串对于存储反向数字很重要,这也是我的代码以前无法工作的一个重要原因。
var e = Math.pow(10, (String(c).length - 1));
添加了Var e 以考虑到小数左侧的不同位置值。稍后,这有助于通过在数字的两边添加1来检查数字是否等于其反向。 Var e 计算 var c 的长度(已删除小数的输入值),并找到稍后要添加的10的相应幂。因此,如果您输入 14.40 * 100,那么稍后它会检查 1440 + 1是否等于 0441 + 1000 ..或 10 ^ 3 即可。此测试后来很重要,以便退出循环。这是我的代码之前失败的原因,因为我没有考虑反向添加数字而我试图添加不可预测的小数。
if (c == b) {
document.write("$" + (c / 100) + "... This price is already palindrome!")
} else {
for (c; c !== b; c++) {
b = reverseIt(c);
if ((c + 1) == (b + e)) {
document.write("The next palindromic price is $" + ((Number(c) + 1) / 100));
break;
}
}
}
这里,如果原始数字和它的反向不相等,则开始循环,将值递增1,直到输入数字+ 1 等于反转数字+ e < / strong>即可。因此,循环有效地在循环结束之前找到数字,写入然后突破循环。无论你把小数点放在哪里,这个回文查找器似乎都可以顺利运行,值大小。很高兴我得到了它...这是一个很好的学习经验搞清楚!