Функция модуля ColdFusion возвращает неправильное значение - PullRequest
0 голосов
/ 15 ноября 2011

Недавно я написал некоторый код, который планирует отправку сообщений на один из наших SMTP-серверов.Эти данные хранятся в базе данных MySQL.Алгоритм планирует сообщения на основе почасового лимита.Вот часть алгоритма, которая находится в цикле для планирования столько сообщений, сколько требуется.

<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,Функция модуля не работает должным образом, так как правильный вывод будет.в ноль.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Не могли бы вы просто изменить это на:

<cfset secondsAdd = minutesPerMail - minutesAdd>
0 голосов
/ 24 октября 2012

Чтобы объяснить MOD немного дальше, он возвращает либо остаток, либо 0. Представьте его как ИСТИНА или ЛОЖЬ, чтобы, если он возвращает ИСТИНА, у него был остаток, но если он возвращал ЛОЖЬ, у него не было остатка. Надеюсь, это поможет понять, почему возвращается целое число, а не число с плавающей запятой.

...