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|