Forum Webscript.Ru

Программирование => Perl => Тема начата: Saffi от 26 Сентября 2003, 15:32:09

Название: Округление числа
Отправлено: Saffi от 26 Сентября 2003, 15:32:09
Здравствуйте уважаемые!
Подскажите пожалуйста, как решить задачу?
В конце скрипта при выведении итога есть выражение:

$tarif= (int ($cost * $tar * $koef * 100))/100;

проблемма в следующем:

$koef = $koef1*$koef2*$koef3*....*$koef-n
при этом множители являются дробными числами (как минимум 2 знака после запятой), пока они перемножаются между собой - все нормально, но вот в конечном выражении, где надо получить итог, т.е. $tarif, $koef требуется округлить до 2-ух знаков после запятой, иначе итог будет неверным.

Спасибо.
Название: Округление числа
Отправлено: NeoNox от 26 Сентября 2003, 15:34:38
perldoc -f sprintf
Название: Округление числа
Отправлено: ondr от 26 Сентября 2003, 15:41:28
или так $tarif = $1 if $tarif =~ /^(\\d+\\.\\d{2})/;
Название: Округление числа
Отправлено: NeoNox от 26 Сентября 2003, 15:59:59
ondr
Цитировать
Saffi:
требуется округлить до 2-ух

$test = "2.259";
print $testn = $1 if $test =~ /^(\\d+\\.\\d{2})/;
print "\\n". sprintf("%.2f", $test);
Почувствуйте разницу
2.25
2.26
Название: Округление числа
Отправлено: Saffi от 26 Сентября 2003, 16:20:31
NeoNox

я ввела в код следующее (скорее всего неправильно, надеюсь подскажете где ошиблась, приведу более детально, может это даст что-то):

$koef = maximum ($koef[1],$koef[2],$koef[3],$koef[4]);
 
if ($rul eq "r") {$koef = $koef*1.5}

if ($dop > 3) {$koef = $koef*1.1}

if ($vznosi == 2) {$koef = $koef*1.05}
if ($vznosi == 3) {$koef = $koef*1.07}

if ($viplati == 1) {$luc_koef = $luc_koef*0.95}
if ($viplati == 3) {$luc_koef = $luc_koef*1.2}


$koef = sprintf("%.2f", $koef);

$tarif= (int ($cost * $tar * $koef * 100))/100;


после расчета все равно получается что округлилось просто обрубившись до 2-ух символов после запятой...
по результатам запроса из формы должно было получиться, что

$koef = 1.1*0.95    , т.е. 1,045 требуется для дальнейшего окончательного расчета округлить это произведение до 1,05  , а округляется все-равно до 1.04... почему-то...
Название: Округление числа
Отправлено: Chs от 26 Сентября 2003, 18:05:37
Saffi
Цифры вмексте с кодом в студию - из данного кода не понятно что вы получеете из формы, присвойте в начале него значение например.
Название: Округление числа
Отправлено: NeoNox от 26 Сентября 2003, 18:16:55
Chs может, конечно, у меня одного так работает...

perl -e "print sprintf(\'%.2f\', \'1.045\')"
1.04
perl -e "print sprintf(\'%.2f\', \'1.0451\')"
1.05
Название: Округление числа
Отправлено: NeoNox от 26 Сентября 2003, 18:31:22
Вообщем на скорую руку:

$test = "1.045";
$test =~ /(.*?\\.)(\\d{2})(\\d)/;
$se = $2;
$se++ if ($3 >= 5);
print $test = $1.$se;
Название: Округление числа
Отправлено: ondr от 26 Сентября 2003, 18:59:13
что еще более странно
perl -e "print sprintf(\'%.2f\', \'1.145\')"
1.15
Название: Округление числа
Отправлено: ondr от 28 Сентября 2003, 03:25:03

sub round_n {
  my ($arg, $rn) = @_;
  $rn += 0;
  $arg += 0;
  study $arg;
  if ($rn >= 0 && $arg =~ /^\\d+\\.(\\d+)$/
  && length($1) > $rn) {
    my ($lp, $rp) = ($arg =~ /^(\\d+\\.\\d{\\Q$rn\\E})(\\d+)$/);
    local $_;
    my $ind = 0;
    for ($_ = length($rp) - 1; $_ >= 0; $_--) {
      my $n = substr($rp, $_, 1);
      if ($ind == 1) {
       $n++;
       $ind = 0;
      }
      $ind = 1 if $n >= 5;
    }
    return ($lp + $ind) if $rn == 0;
    return $lp + (\'0.\' . (\'0\' x ($rn - 1)) . $ind);
  } else {
    return $arg;
  }
}


Использование:
my $t = 1.045;
my $tt = round_n($t, 2);
print $tt; # 1.05

где второй аргумент - сколько оставить после точки, остальные обрезать, может быть от 0 и до ....
Название: Округление числа
Отправлено: Saffi от 29 Сентября 2003, 10:54:59
Спасибо большое... вся ошибка в строке

#$koef = sprintf("%.2f", $luc_koef);

состояла в кавычках - поставила одинарные - все заработало...

#$koef = sprintf(\'%.2f\', $luc_koef);