Javascript数字比较不正确
我正在用javascript做一些数学题,但我一直没有得到预期的结果 这是我的函数-一些部分已经简化Javascript数字比较不正确,javascript,Javascript,我正在用javascript做一些数学题,但我一直没有得到预期的结果 这是我的函数-一些部分已经简化 function updateExample($widget) { var loan = parseInt($widget.attr("data-loan"), 10); var term = parseInt($widget.attr("data-term"), 10); // Get the best rate var rateInfo = GetRateI
function updateExample($widget) {
var loan = parseInt($widget.attr("data-loan"), 10);
var term = parseInt($widget.attr("data-term"), 10);
// Get the best rate
var rateInfo = GetRateInfo(loan, term);
var annualRate = rateInfo[2];
// Calculate costs
var rate = (term === 1
? annualRate / 365 * 30
: annualRate / 12) / 100;
var pow = Math.pow(rate + 1, term);
var payment = round(rate * pow / (pow - 1) * loan, 2);
var totalRepayable = round(payment * term, 2);
var totalCostCap = round(loan * 2, 2);
var costCapped = false;
console.log(totalRepayable);
console.log(totalCostCap);
if (totalRepayable > totalCostCap) {
console.log("capped");
}
}
失败的测试之一是我通过了500英镑的贷款和1英镑的期限
如您所见,我将3个值记录到控制台。输出的前2个值为:
620.00和1000.00
给定这些值,我希望下面的测试失败,但它不会
如果(应偿还总额>总成本上限)
如果(620.00>1000.00)
控制台日志读取“capped”以证明已输入if语句
我无论如何都不是javascript专家,但我看不出这是如何失败的
以下是自定义的圆形函数:
function round(value, decimals) {
return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals).toFixed(decimals);
}
非常感谢您的建议。您没有显示
round
函数,但我假设它使用的是.toFixed()
。问题是你实际上没有任意精度的浮点数,所以它会转换成字符串,然后
console.log("620.00" > "1000.00"); // true
给我通风报信的是,如果你在控制台上记录一个像620.00
这样的数字,它会自动将其截断,你看到尾随的零这一事实表明它是一个字符串
更新
是的,现在你发布了它肯定会返回一个字符串。返回值的最后一部分是调用
.toFixed()
。只需将结果转换回一个数字进行比较。您的轮函数是什么?对不起,我没有意识到这是一个自定义函数-让我看看。轮函数似乎返回字符串?您编写它就像函数调用一样,这可能会混淆JS新手(如OP)。帕伦夫妇完全没有必要。它在编写过程中始终有效的唯一原因是paren的运算符优先级高于typeof
(否则会出现引用错误)。您所写的内容是这样计算的typeof(totalreturnable)
和任何其他单个表达式一样totalreturnable
将对自身进行计算。好的。删除以避免混淆:)我找到并添加了round函数-您认为它使用.toFixed()@JohnOhara-yup是正确的。只需将结果转换回数字即可进行比较(+totalreturnable>+totalCostCap)
。不知道为什么Brendan Eich认为使用unicode点值对字符串进行更大的比较是个好主意,但是呢。@JaredSmith-WOAH!您是否有任何文档说明其工作原理?我从未见过这种技巧before@TheCrzyMan你是说一元加号运算符?谢谢你的帮助,杰瑞德。我已经删除了totalCostCap上的四舍五入,并在最终确定数字时,在if语句之后移动了其他两个回合,不需要进行严格化,然后再进行回放。