-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 演算子は、オペランドと結果を切り捨てて整数にする代わりに、float で機能します。仕様を引用するには:

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 round-to-nearest モードを使用して最も近い表現可能な値に丸められます。

最後の部分では、浮動小数点演算の小さな丸め誤差から他の 10 進数が得られる可能性が高い理由についても説明しています。

同等の行の 1 つを省略できます

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

のいずれかを追加します。

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

「時間」の間違った結果

私はそれを見ることができません。タイムゾーンに応じて値が動作することを期待していた可能性はありますか? UTCgetTimeであるエポックからのミリ秒を返します。

于 2012-12-13T09:06:47.710 に答える