Javascript 30天周期中使用的天数与未使用的天数(问题:加起来不正确)

Javascript 30天周期中使用的天数与未使用的天数(问题:加起来不正确),javascript,math,Javascript,Math,我对Javascript非常陌生,无法找出正确的公式来确定已使用和未使用的天数 我正在尝试创建一个基本表单计算器。它有两个字段,账单周期日期和计划更改日期。它应该计算两个数字之间的差值 问题是,有时计费周期日期低于计划更改日期,这会导致一个负数,这与我当前的公式不符 我做错了什么 我尝试过不同的公式,甚至尝试过只显示积极的一面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8

我对Javascript非常陌生,无法找出正确的公式来确定已使用和未使用的天数

我正在尝试创建一个基本表单计算器。它有两个字段,账单周期日期和计划更改日期。它应该计算两个数字之间的差值

问题是,有时计费周期日期低于计划更改日期,这会导致一个负数,这与我当前的公式不符

我做错了什么

我尝试过不同的公式,甚至尝试过只显示积极的一面

<!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
为例。如果我们这样做