Forum Webscript.Ru
Программирование => Perl => Тема начата: Saffi от 26 Сентября 2003, 15:32:09
-
Здравствуйте уважаемые!
Подскажите пожалуйста, как решить задачу?
В конце скрипта при выведении итога есть выражение:
$tarif= (int ($cost * $tar * $koef * 100))/100;
проблемма в следующем:
$koef = $koef1*$koef2*$koef3*....*$koef-n
при этом множители являются дробными числами (как минимум 2 знака после запятой), пока они перемножаются между собой - все нормально, но вот в конечном выражении, где надо получить итог, т.е. $tarif, $koef требуется округлить до 2-ух знаков после запятой, иначе итог будет неверным.
Спасибо.
-
perldoc -f sprintf
-
или так $tarif = $1 if $tarif =~ /^(\\d+\\.\\d{2})/;
-
ondr
Saffi:
требуется округлить до 2-ух
$test = "2.259";
print $testn = $1 if $test =~ /^(\\d+\\.\\d{2})/;
print "\\n". sprintf("%.2f", $test);
Почувствуйте разницу
2.25
2.26
-
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... почему-то...
-
Saffi
Цифры вмексте с кодом в студию - из данного кода не понятно что вы получеете из формы, присвойте в начале него значение например.
-
Chs может, конечно, у меня одного так работает...
perl -e "print sprintf(\'%.2f\', \'1.045\')"
1.04
perl -e "print sprintf(\'%.2f\', \'1.0451\')"
1.05
-
Вообщем на скорую руку:
$test = "1.045";
$test =~ /(.*?\\.)(\\d{2})(\\d)/;
$se = $2;
$se++ if ($3 >= 5);
print $test = $1.$se;
-
что еще более странно
perl -e "print sprintf(\'%.2f\', \'1.145\')"
1.15
-
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 и до ....
-
Спасибо большое... вся ошибка в строке
#$koef = sprintf("%.2f", $luc_koef);
состояла в кавычках - поставила одинарные - все заработало...
#$koef = sprintf(\'%.2f\', $luc_koef);