Forum Webscript.Ru
Программирование => Perl => Тема начата: FANTAzeRus от 17 Ноября 2003, 15:23:47
-
Имею: допустим число 43
Хочу: Получить число ближайшее(большее) 50
типа функции
$max=48;
my $HIGH=getHign($max);
-
Ты хоть сам то понял что написал?
-
Так понятнее???
43-50
27-30
18-20
3-10
79-80
-
т.е. нужно найти следующее большее число кратное 10
-
int($max/10)*10+10;
-
Фсе получилось! Спасибо!
-
ondr:
int($max/10)*10+10;
Если только в $max не число оканчиваюшееся на 0.
-
vladsu
Ты не знаешь как выполнить проверку?
Тебя это смущает?
Или тебе хочется пофлеймить?
Если ты знаешь вариант лучше, напиши его, и тебе будут благодарны, а такие посты, как твой, вызывают лишь негативную реакцию.
-
ondr ответил на поставленный вопрос абсолютно верно.
Тема закрыта.
-
NeoNox
Не прав,
до обсуждения floor и ceil не дошли.
FANTAzeRus
ondr
Рекомендую посмотреть что бы обойтись без лишних проверок.
-
Тему открыл.
Chs
Ок хочется услышать обоснование подгрузки POSIX в данном случае.
И еще раз напомню условие:
FANTAzeRus:
Имею: допустим число 43 Хочу: Получить число ближайшее(большее) 50
-
NeoNox
хочется услышать обоснование подгрузки POSIX в данном случае.
Ну можно подгрузить всего одну функцию и если мне не изменяет память, то начиная с какойто версии перла POSIX подгружается автоматом.
А все это затем, что бы потом, когда вокруг этой программы нарастет еще не одна не разбираться в странной ошибке.:))
-
(пожимая плечами)There\'s More Than One Way To Do It! ;)
Кстати я не совсем уверен в автоматической загрузке POSIXа. Даже наоборот... Perl 5.8.0
-
ondr:
вызывают лишь негативную реакцию.
Негативную реакцию вызывает Ваш пост, а я всего лишь хотел обратить внимание на "подводный камень"!
По теме:
use Math::Round qw(nhimult);
my $osn = 10;
my @a = qw(1 4 5 9 1.1 1.12 10 10.00000001 19 -1 -1.1 -10);
print $_, " => ", nhimult($osn, $_),"\\n" for @a;
Хотя это частнай случай POSIX.
-
Можно сделать проще и без проверок :)
#!/usr/bin/perl
@digits=(1,12,14,23,49,55,20,70,92,56,31,49,80,900,782);
foreach $digit (@digits)
{
print "$digit - ",round($digit),"\\n";
}
sub round
{
return($_[0]-$_[0]%10+10*($_[0]%10!=0))
}
Значение перации $_[0]%10 можно сохранить в скаляре и заменить ее на этот скаляр.
Результат работы:
1 - 10
12 - 20
14 - 20
23 - 30
49 - 50
55 - 60
20 - 20
70 - 70
92 - 100
56 - 60
31 - 40
49 - 50
80 - 80
900 - 900
782 - 790
-
C++:
Можно сделать проще и без проверок
1.1 ?
-1.1 ?
-
vladsu
Тоже самое, только передавать нужно целое число :)
На самом деле, речь шла только о натуральных числах, о рациональных и отрицательных числах не было сказано ни слова....
А если надо, чтобы отрицательные числа округлялись к меньшему десятку, то use roundABS :)
#!/usr/bin/perl
@digits=(-1.1,1.2,14.7,-23.5,49.5,-55.7,20.9,-70,-92,56,31,49,80);
print "Digit| rABS | ABS |\\n";
print "----- ------ -----\\n";
foreach $digit (@digits)
{
printf("%5.1f|%6d|%5d|\\n",$digit,roundABS(int($digit)),round(int($digit)));
}
sub round
{
return($_[0]-$_[0]%10+10*($_[0]%10!=0))
}
sub roundABS
{
return($_[0]-$_[0]%10+10*($_[0]%10!=0)*($_[0]>0))
}
Digit| rABS | ABS |
----- ------ -----
-1.1| -10| 0|
1.2| 10| 10|
14.7| 20| 20|
-23.5| -30| -20|
49.5| 50| 50|
-55.7| -60| -50|
20.9| 20| 20|
-70.0| -70| -70|
-92.0| -100| -90|
56.0| 60| 60|
31.0| 40| 40|
49.0| 50| 50|
80.0| 80| 80|