-1

我有 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;
    };

它以某种方式起作用,但我仍然在“秒”部分得到浮点而不是整数,在“小时”得到错误结果。有任何想法吗?

4

1 回答 1

2

我仍然在“秒”部分得到浮点而不是整数

你从来没有把它弄圆。虽然您得到的毫秒getTime数是一个整数,但在除以 1000 以转换为秒后,您得到一个带有 3 位小数的浮点数。

此外,EcmaScript Modulus 运算符确实适用于浮点数,而不是将操作数和结果截断为整数。引用规范:

在 C 和 C++ 中,余数运算符只接受整数操作数;在 ECMAScript 中,它也接受浮点操作数。

由 % 运算符计算的浮点余数运算的结果与 IEEE 754 定义的“余数”运算不同。IEEE 754“余数”运算从舍入除法计算余数,而不是截断除法,因此它的行为与通常的整数余数运算符不同。相反,ECMAScript 语言在浮点运算上定义 % 以类似于 Java 整数余数运算符的行为方式;这可以与 C 库函数 fmod 进行比较。

在不涉及无穷大、零或 NaN 的情况下 [...],被除数 n 和除数 d 的浮点余数 r 由数学关系 r = n - (d * q) 定义,其中 q 是仅当 n/d 为负时为负的整数,仅当 n/d 为正时为正,并且其大小尽可能大而不超过 n 和 d 的真实数学商的大小。r 使用 IEEE 754 舍入到最近模式计算并舍入到最接近的可表示值。

最后一部分还解释了为什么我们可能会从浮点运算中的小舍入误差中得到一些其他小数。

您可以省略等效的行之一

    o.seconds -= o.minutes * (60);
    o.seconds %= 60;

并添加其中之一

    o.seconds = Math.round(o.seconds);
    o.seconds = Math.floor(o.seconds);

“小时”的错误结果

我看不到那个。您是否可能确实期望该值根据您的时区表现?getTime返回自纪元以来的毫秒数,以UTC为单位。

于 2012-12-13T09:06:47.710 回答