我从here获取了jquery倒计时,并尝试使用cookie修改以获得持久性结果,如下所示: 的被修改
<script type="text/javascript">
(function($) {
function countdown(el, options) {
var calc = function (target, current) {
var o = {};
var datetarget = getCookie('Target');
if(!datetarget) {
clearInterval(cd.id);
var datetarget = target.getTime()/1000;
}
if(datetarget <= 0) { return true; }
deleteCookie('Target');
o.seconds = datetarget;
o.seconds %= 86400;
o.hours = Math.floor(o.seconds/3600);
o.seconds -= o.hours * (3600);
o.minutes = Math.floor(o.seconds/60);
o.seconds -= o.minutes * (60);
o.seconds %= 60;
datetarget -= 1;
setCookie('Target',datetarget,1);
return o;
};
它以某种方式工作但我仍然在“秒”部分浮动而不是整数而在“小时”错误的结果。有什么想法吗?
答案 0 :(得分:2)
我在“秒”部分
上仍然有浮动而不是整数
你永远不会把它弄圆。虽然从getTime
获得的毫秒数是一个整数,但是在除以1000后得到一个带有3位小数的浮点数,以转换为秒数。
此外,EcmaScript Modulus operator对浮点数有效,而不是截断操作数并导致整数。引用规范:
在C和C ++中,余数运算符只接受整数操作数; 在ECMAScript中,它也接受浮点操作数。
由浮点数计算的浮点余数运算的结果 %运算符与定义的“余数”运算不同 IEEE 754. IEEE 754“余数”操作计算余数 来自一个舍入部门,而不是一个截断部门,所以它 行为与通常的整数余数不相似 运营商。而是ECMAScript语言在浮点上定义% 操作以类似于Java整数的方式运行 余数运算符;这可以与C库函数进行比较 FMOD。
无论是无限,也不是零,也不涉及NaN [...] 从被除数n和除数d得到的浮点余数r 由数学关系r = n - (d * q)定义,其中q是a 仅当n / d为负时才为负的整数,仅当为n时为正 n / d是正的,其大小尽可能大 超过n和d的真实数学商的大小。 计算r并使用舍入到最接近的可表示值 IEEE 754舍入到最接近的模式。
最后一部分也解释了为什么我们可能会从floating point arithmetic中的小舍入误差中得到一些其他小数。
您可以省略其中一个等效行
o.seconds -= o.minutes * (60);
o.seconds %= 60;
并添加其中一个
o.seconds = Math.round(o.seconds);
o.seconds = Math.floor(o.seconds);
“小时”错误的结果
我看不出来。你有可能期望价值符合你的时区吗? getTime
返回自纪元以来的毫秒,即 UTC 。