Автор Тема: Округление числа  (Прочитано 5588 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Saffi

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.insurance2000.ru
Округление числа
« : 26 Сентября 2003, 15:32:09 »
Здравствуйте уважаемые!
Подскажите пожалуйста, как решить задачу?
В конце скрипта при выведении итога есть выражение:

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

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

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

Спасибо.
Лучше поначалу замучить вопросами, чем после оказаться неготовым к ответу.

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #1 : 26 Сентября 2003, 15:34:38 »
perldoc -f sprintf
The documentations is your friend

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #2 : 26 Сентября 2003, 15:41:28 »
или так $tarif = $1 if $tarif =~ /^(\\d+\\.\\d{2})/;
0 OK, 0:1

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #3 : 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
The documentations is your friend

Оффлайн Saffi

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.insurance2000.ru
Округление числа
« Ответ #4 : 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

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Округление числа
« Ответ #5 : 26 Сентября 2003, 18:05:37 »
Saffi
Цифры вмексте с кодом в студию - из данного кода не понятно что вы получеете из формы, присвойте в начале него значение например.
2B OR NOT 2B = FF

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #6 : 26 Сентября 2003, 18:16:55 »
Chs может, конечно, у меня одного так работает...

perl -e "print sprintf(\'%.2f\', \'1.045\')"
1.04
perl -e "print sprintf(\'%.2f\', \'1.0451\')"
1.05
The documentations is your friend

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #7 : 26 Сентября 2003, 18:31:22 »
Вообщем на скорую руку:

$test = "1.045";
$test =~ /(.*?\\.)(\\d{2})(\\d)/;
$se = $2;
$se++ if ($3 >= 5);
print $test = $1.$se;
The documentations is your friend

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #8 : 26 Сентября 2003, 18:59:13 »
что еще более странно
perl -e "print sprintf(\'%.2f\', \'1.145\')"
1.15
0 OK, 0:1

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Округление числа
« Ответ #9 : 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 и до ....
« Последнее редактирование: 29 Сентября 2003, 10:46:58 от ondr »
0 OK, 0:1

Оффлайн Saffi

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 15
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.insurance2000.ru
Округление числа
« Ответ #10 : 29 Сентября 2003, 10:54:59 »
Спасибо большое... вся ошибка в строке

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

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

#$koef = sprintf(\'%.2f\', $luc_koef);
Лучше поначалу замучить вопросами, чем после оказаться неготовым к ответу.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28