2013-10-03 2 views
1

Я хочу, чтобы найти (учитывая число, которое может быть флоат), как найти следующий кратное 60.
я делаю следующее, который работает:Найти следующий кратные числа

my $nextMultiple = int($input/$constant);                                   
$nextMultiple = ((int($nextMultiple/60)) * 60);                                 
$nextMultiple += 60; 

Я фактически добавляю 60 в последнюю строку специально. Есть ли лучший способ для этого?

+2

Какое значение вы хотите, если число уже кратно 60? – cjm

+0

Хм, XY-проблема? Нужно округлить до ближайшей минуты? – Zaid

ответ

1

Если вы хотите кратные 60, чтобы быть неизменным:

use POSIX 'ceil'; 

my $next_multiple = ceil(($input/$constant)/60) * 60; 

Если вы хотите кратные 60, чтобы быть увеличено до следующего кратного (как существующий код делает):

use POSIX 'floor'; 

my $next_multiple = (1 + floor(($input/$constant)/60)) * 60; 
1

Следующий самый высокий:

# 121 => 180 -119 => -60 
# 120 => 180 -120 => -60 
# 119 => 120 -121 => -120 

$n - ($n % 60) + 60 

Следующая по величине:

# 121 => 180 -119 => -120 
# 120 => 180 -120 => -180 
# 119 => 120 -121 => -180 

$n + ($n >= 0 ? +1 : -1) * (60 - (abs($n) % 60)) 

$n % 60 == 0 сообщит вам, если $ п кратно 60.

+0

Я думал, что использование 'int' может взаимодействовать с ошибкой округления от деления на 60, чтобы дать неправильный ответ, но я больше не верю в это. У вас все хорошо. – ikegami

+0

На языке более низкого уровня мой подход (3 целых операции) будет намного быстрее, чем 'int' или' ceil', но это в основном потеряно в шуме с Perl. – ikegami

Смежные вопросы