Javascript 30天周期中使用的天数与未使用的天数(问题:加起来不正确)
我对Javascript非常陌生,无法找出正确的公式来确定已使用和未使用的天数 我正在尝试创建一个基本表单计算器。它有两个字段,账单周期日期和计划更改日期。它应该计算两个数字之间的差值 问题是,有时计费周期日期低于计划更改日期,这会导致一个负数,这与我当前的公式不符 我做错了什么 我尝试过不同的公式,甚至尝试过只显示积极的一面Javascript 30天周期中使用的天数与未使用的天数(问题:加起来不正确),javascript,math,Javascript,Math,我对Javascript非常陌生,无法找出正确的公式来确定已使用和未使用的天数 我正在尝试创建一个基本表单计算器。它有两个字段,账单周期日期和计划更改日期。它应该计算两个数字之间的差值 问题是,有时计费周期日期低于计划更改日期,这会导致一个负数,这与我当前的公式不符 我做错了什么 我尝试过不同的公式,甚至尝试过只显示积极的一面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<form>
<input placeholder="Billing Cycle Date" type="text" onChange="calc()" id="BillingCycleDate"/>
<input placeholder="Plan Change Date" type="text" onChange="calc()" id="PlanChangeDate"/>
<input type="button" onClick="calc()" value="Calculate" />
</form>
<div id="BillingCycleDate_Result"></div>
<div id="PlanChangeDate_Result"></div>
<div id="DaysUsed_Result"></div>
<div id="DaysUnused_Result"></div>
<div id="DaysUsedDaysUnused_Result"></div>
<script>
function calc(){
//Imports data from form - Billing Cycle Date
var BillingCycleDateJS=document.getElementById('BillingCycleDate').value;
//Imports data from form - Plan Change Date
var PlanChangeDateJS=document.getElementById('PlanChangeDate').value;
//Calculates - Used Days
var DaysUsed=+BillingCycleDateJS-PlanChangeDateJS;
//Calculates - Unused Days
var DaysUnused=+PlanChangeDateJS-BillingCycleDateJS;
//Calculates - Days Used & Unused (Should always = 30)
var DaysUsedDaysUnused=DaysUsed+DaysUnused;
//Prints Result - Data Billing Cycle Date
document.getElementById('BillingCycleDate_Result').innerHTML='<br>Billing Cycle Date: ' + BillingCycleDateJS + '<br><br>';
//Prints Result - Plan Change Date
document.getElementById('PlanChangeDate_Result').innerHTML='Plan Change Date: ' + PlanChangeDateJS + '<br><br>';
//Prints Result - Days Used
document.getElementById('DaysUsed_Result').innerHTML='Days Used: ' + DaysUsed + '<br><i>(If billing cycle = 1 & plan change date = 10, answer should be: 9)<br>(If billing cycle = 10 & plan change date = 1, answer should be: 21)</i><br><br>';
//Prints Result - Data Unused
document.getElementById('DaysUnused_Result').innerHTML='Days Unused: ' + DaysUnused + '<br><i>(If billing cycle = 1 & plan change date = 10, answer should be: 21)<br>(If billing cycle = 10 & plan change date = 1, answer should be: 9)</i><br><br>';
//Prints Result - Billing Cycle Date + Plan Change Date
document.getElementById('DaysUsedDaysUnused_Result').innerHTML='Days Used+Unused: ' + DaysUsedDaysUnused + '<br><i> (Billing Cycle+Plan Change, Should always = 30)</i>';
return false
}
</script>
</body>
</html>
文件
函数计算(){
//从表单导入数据-账单周期日期
var BillingCycleDateJS=document.getElementById('BillingCycleDate')。值;
//从表单导入数据-计划更改日期
var PlanChangeDateJS=document.getElementById('PlanChangeDate')。值;
//计算使用天数
var DaysUsed=+BillingCycleDateJS PlanChangeDateJS;
//计算未使用天数
var DaysUnused=+PlanChangeDateJS BillingCycleDateJS;
//计算-已使用和未使用天数(应始终=30)
var DaysUsedDaysUnused=DaysUsed+DaysUnused;
//打印结果-数据计费周期日期
document.getElementById('BillingCycleDate_Result')。innerHTML='
计费周期日期:'+BillingCycleDateJS+'
';
//打印结果-计划更改日期
document.getElementById('PlanChangeDate_Result')。innerHTML='PlanChangeDate:'+PlanChangeDateJS+'
';
//打印结果-使用天数
document.getElementById('DaysUsed_Result')。innerHTML='Days Used:'+DaysUsed+'
(如果计费周期=1,计划更改日期=10,答案应该是:9)
(如果计费周期=10,计划更改日期=1,答案应该是:21)
;
//打印结果-未使用的数据
document.getElementById('DaysUnused_Result')。innerHTML='DaysUnused:'+DaysUnused+'
(如果计费周期=1,计划更改日期=10,答案应该是:21)
(如果计费周期=10,计划更改日期=1,答案应该是:9)
;
//打印结果-计费周期日期+计划更改日期
document.getElementById('DaysUsedDaysUnused_Result')。innerHTML='Days Used+Unused:'+DaysUsedDaysUnused+'
(计费周期+计划变更,应始终=30)';
返回错误
}
如果计费日期=1
如果计划变更日期=10 实际结果:
使用天数:-9
未使用天数:9 预期成果:
使用天数:9
未使用天数:21
如果计费日期=10
如果计划变更日期=1 实际结果:
使用天数:9
未使用天数:-9 预期成果:
使用天数:21
未使用天数:9你的数学算错了:
//Calculates - Used Days
var DaysUsed=+BillingCycleDateJS-PlanChangeDateJS;
//Calculates - Unused Days
var DaysUnused=+PlanChangeDateJS-BillingCycleDateJS;
//Calculates - Days Used & Unused (Should always = 30)
var DaysUsedDaysUnused=DaysUsed+DaysUnused;
在你的例子中使用的daysun总是DaysUsed的负数。如果必须加上30,只需执行以下操作:
DaysUsed=30-DaysUsed
如果DaysUsed为负数,则可以加30得到补码:
DaysUsed=+BillingCycleDateJS-PlanChangeDateJS;
DaysUsed = DaysUsed < 0 ? DaysUsed + 30 : DaysUsed;
DaysUsed=+BillingCycleDateJS PlanChangeDateJS;
DaysUsed=DaysUsed<0?DaysUsed+30:DaysUsed;
计算的基本问题是没有考虑方向性。如果billing
,则应计算change-billing
。否则,如果billing>change
,您需要考虑过渡到下个月所累积的额外天数,即30+change-billing
。在月份转换期间,缺少额外的天数,这是给你带来问题的原因
请注意,上面这些计算的唯一区别在于是否将额外的30添加到总数中。还要注意,结果将始终小于30。因此,您可以利用模%
运算符
如果您不知道,模运算符将采用a%b
形式的表达式,其中a
和b
都是数字,结果将是a/b
的“余数”。您可以使用以下代码可视化模运算符的预期结果:
function modulo(a, b) {
while(a > b) {
a -= b;
}
return a;
}
(请注意,上述是对模运算符的过度简化,且上述仅适用于a
和b
均为正数的情况。)
考虑到上述运算符,我们可以充分利用它,将30
天添加到计算结果中,以模拟一个月的滚动,然后确保在不需要滚动的情况下,将总数减少到30
以下
var DaysUsed = (30 + (+PlanChangeDateJS-BillingCycleDateJS)) % 30;
由于我们知道DaysUsed+DaysUnused==30
是一个约束,因此我们可以通过执行以下操作来计算DaysUnused
:
var DaysUsed = (30 + (+PlanChangeDateJS-BillingCycleDateJS)) % 30;
var DaysUnused = 30 - DaysUsed;
Java之于Javascript,犹如痛苦之于绘画,火腿之于仓鼠。他们完全不同。强烈建议有抱负的程序员尝试学习他们试图编写代码的语言的名称。当你发布一个问题时,请给它贴上适当的标签。这不起作用。如果计费日期为
10
,而计划更改日期为1
,则所用天的预期结果为21
,但代码的结果为9
。使用日期间隔计算,您不能只取绝对值。非常感谢您的帮助!我真的很感激。另外,感谢您通过使用模运算符扩展我对JS的了解,从而超越我的理解。如果我理解正确的话,模运算符是这样工作的。。。。如果=正数,做数学方程式#1如果=负数,做数学方程式#2@JamesMiller不完全是。想象一下把两个数字分开。结果是结果中未减少的分数分量的分子。例如,以17%5
为例。如果我们这样做