1
好吧,我远离数学高手。哎呀,我记得有足够的高中代数来拼凑任何工作公式对我来说是胜利的事实。所以如果你注意到这里有一个不太长或者混乱的公式,那就解释了这一点。公式返回稍低于“正确”答案的值?
但是,正如人们可以合理预料的那样,这里出现了一些问题。
我正试图做一个简单的计算器,显示购买旅行车票与支付现金票价的成本节省。我非常接近,但是我使用的公式计算结果在某些情况下并不正确,我无法弄清楚原因。
在下面的例子中,基本区域和区域4按我的预期计算差异,而区域1-3只在正确答案的下方(即$ 105.60000000000014而不是$ 106)返回答案,而区域1和2虽然公式不同,但返回相同的答案。
我看过这个,直到我走掉了。我相信答案很简单,但我看不到它。任何人?
感谢您的帮助。
下面的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script language="javascript">
<!-- Begin Trip Tickets Savings Calc script
function doMath4() {
var one = parseInt(document.theForm4.elements[0].value);
var two = parseInt(document.theForm4.elements[1].value);
var selection = document.getElementsByName("zonett")[0].value;
if(selection == "z4"){
var prodZ4tt = (((one * two) * 4.25) *12) - (((one * two) * 3.75) *12);
alert("Your yearly savings if you buy Trip Tickets is $" + prodZ4tt + ".");
}
else if(selection == "z3"){
var prodZ3tt = (((one * two) * 3.75) *12) - (((one * two) * 3.35) *12);
alert("Your yearly savings if you buy Trip Tickets is $" + prodZ3tt + ".");
}
else if(selection == "z2"){
var prodZ2tt = (((one * two) * 3) *12) - (((one * two) * 2.8) *12);
alert("Your yearly savings if you buy Trip Tickets is $" + prodZ2tt + ".");
}
else if(selection == "z1"){
var prodZ1tt = (((one * two) * 2.5) *12) - (((one * two) * 2.3) *12);
alert("Your yearly savings if you buy Trip Tickets is $" + prodZ1tt + ".");
}
else if(selection == "Base"){
var prodBasett = (((one * two) * 1.5) *12) - (((one * two) * 1.5) *12);
alert("Your yearly savings if you buy Trip Tickets is $" + prodBasett + ".");
}
}
// End Trip Tickets Savings Calc script -->
</script>
</head>
<body>
<form name="theForm4" class="calcform">
<h2>You Do the Math: Commuter Express Trip Tickets Vs. Cash</h2>
<div class="calcform-content">
<div class="formrow-calc">
<div class="calcform-col1">
<p>Days you commute on Commuter Express monthly:</p>
</div>
<div class="calcform-col2">
<input type="text">
</div>
<div class="calcform-col3"> </div>
</div>
<div class="clear"></div>
<div class="formrow-calc">
<div class="calcform-col1">
<p>Daily boardings on Commuter Express Bus:</p>
<table border="0" cellspacing="0" cellpadding="0" class="fareexampletable">
<tr>
<td colspan="2" class="savingsleft"><p class="ifyouride">EXAMPLE:</p></td>
</tr>
<tr>
<td class="savingsleft"><p><strong>Go to work:</strong></p></td>
<td class="savingsright"><p>1 time</p></td>
</tr>
<tr>
<td class="savingsleft"><p><strong>Come home from work:</strong></p></td>
<td class="additionline savingsright"><p>+1 time</p></td>
</tr>
<tr>
<td class="savingsleft"><p><strong>Total:</strong></p></td>
<td class="savingsright"><p>2 times</p></td>
</tr>
</table>
</div>
<div class="calcform-col2">
<input type="text">
</div>
<div class="calcform-col3"> </div>
</div>
<div class="clear"></div>
<div class="formrow-calc savings-zone">
<div class="calcform-col1">
<p>Choose Zone:</p>
</div>
<div class="calcform-col2">
<select name="zonett">
<option value="Base">Base</option>
<option value="z1">Zone 1</option>
<option value="z2">Zone 2</option>
<option value="z3">Zone 3</option>
<option value="z4">Zone 4</option>
</select>
</div>
</div>
<div class="formrow-calc">
<div class="calcform-col4-ce">
<button type="submit" onclick="doMath4()" class="btn-submit"><div class="btn-submit"><img src="img/btn_savings.png" alt="Show My Yearly Savings" /></div></button>
</div>
</div>
<div class="clear">
</div>
</div>
</form>
</body>
</html>
我同意@hammar虽然有点更多的见解可能已经显示给用户..试试看这里http://stackoverflow.com/questions/588004/is-javascripts-math-broken – gruntled 2011-05-09 21:58:04
谢谢,gruntled。事实上,更多的见解是有帮助的,恐怕你连接的答案对我来说是完整的希腊语。 Epsilon值?错误常量?事实是,我是一名设计师和前端人物,但像我这样的人不可避免地被要求制作类似这样的作品,即使像我这样的人在大学里一直走过Count Intro。所以我想我在问这是如何适用于我的情况,以及我如何能够为我工作......? – user719431 2011-05-09 22:18:31
基本上,因为计算机计算基数为2(1和0)的数字,所以有些数字不可能精确。相反,他们将被关闭0.00000001或一些这样的数字。调用[Math.Round()](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math/round)以使其达到“足够接近”状态,或者您可能需要编写自己的舍入函数,如果整数没有足够的精度。 – Michal 2011-05-09 22:44:35