-1

最近、SMTPサーバーの1つに送信するメッセージをスケジュールするコードをいくつか作成しました。このデータはMySQLデータベースに保存されます。アルゴリズムは、1時間ごとの制限に基づいてメッセージをスケジュールします。これはアルゴリズムの一部であり、必要な数のメッセージをスケジュールするためのループ内にあります。

<cfif hourlyLimit lte 60>
    <cfset minutesPerMail = 60 / hourlyLimit>
    <cfset minutesAdd = int(minutesPerMail)>
    <cfset secondsAdd = round((minutesPerMail % 1) * 60)>
    <cfset queueDate = #DateAdd('n', minutesAdd, queueDate)#>
    <cfset queueDate = #DateAdd('s', secondsAdd, queueDate)#>

デバッグの目的で、この部分に次のコードを追加しました...

<cfdump var="#minutesPerMail#"> (Outputs 1.421857...)
<cfdump var="#secondsAdd#"> (Outputs 0)

もともと丸め誤差があるのではないかと思ったので、次のコードを追加しました...

<cfset modTest = minutesPerMail % 1>
<cfdump var="#modTest#"> (Outputs 0)

ご覧のとおり、modTest変数を使用すると、適切な出力が.421857 ...になるため、モジュラス関数が適切に機能しません。

編集/解決策:ColdFusion内でモジュラスアクションを実行すると、浮動小数点数ではなく整数が返されるため、要素は自動的にゼロに丸められます。

4

2 に答える 2

2

これに変更することはできません:

<cfset secondsAdd = minutesPerMail - minutesAdd>
于 2011-11-14T22:34:55.620 に答える
-1

MODをもう少し詳しく説明すると、剰余または0のいずれかを返します。TRUEまたはFALSEと考えると、TRUEを返す場合は剰余がありますが、FALSEを返す場合は剰余がありません。これが、floatではなく整数を返す理由を明確にするのに役立つことを願っています。

于 2012-10-24T16:11:34.093 に答える