Просто: как парные числа работают в Perl? - PullRequest
2 голосов
/ 03 июля 2010

Я очень озадачен тем, как десятичные числа работают в Perl. У меня проблемы с умножением int на double. Вот что у меня есть:

sub timeEstimate(){
$number = shift;
print "Number: $number\n";
$stuff = sprintf("%d", $number * $number * $number) * .2045;
print "stuff: $stuff\n";
$totalDownloads = $stuff + ($number * $number) + $number;
print "totalDownloads: $totalDownloads\n";
$secondPerFile = .4464;
print "secondPerFile: $secondPerFile\n";
$totalSeconds = ($totalDownloads * $secondPerFile);
print "totalSeconds: $totalSeconds\n";
$totalHours = ($totalSeconds / 3600);
print "totalHours: $totalHours\n";
return $totalHours;
}

Но что бы я ни пытался, даже sprintf, я все равно не могу заставить $ вещи быть чем-либо, кроме 0. Может ли кто-нибудь объяснить, как работает система?

ОБНОВЛЕНО решено: из-за глупой ошибки, нанесенной самому себе. У меня было

use integer; 

в коде. headdesk

Ответы [ 4 ]

3 голосов
/ 03 июля 2010

Как только переменные объявлены и прототип удален из функции, ваш код работает:

use warnings;
use strict;

sub timeEstimate {
    my $number = shift;
    print "Number: $number\n";

    my $stuff = sprintf("%d", $number * $number * $number) * .2045;
    print "stuff: $stuff\n";

    my $totalDownloads = $stuff + ($number * $number) + $number;
    print "totalDownloads: $totalDownloads\n";

    my $secondPerFile = .4464;
    print "secondPerFile: $secondPerFile\n";

    my $totalSeconds = ($totalDownloads * $secondPerFile);
    print "totalSeconds: $totalSeconds\n";

    my $totalHours = ($totalSeconds / 3600);
    print "totalHours: $totalHours\n";
    return $totalHours;
}

timeEstimate 10;


Number: 10
stuff: 204.5
totalDownloads: 314.5
secondPerFile: 0.4464
totalSeconds: 140.3928
totalHours: 0.038998

В функциях Perl вам всегда нужно объявлять переменные с помощью ключевого слова my (которое выделяет переменную с лексической областью), иначе вы столкнетесь с проблемами. Использование use warnings; use strict; в верхней части каждой программы не даст вам забыть, а также предоставит много полезных диагностических сообщений.

Прототип (), установленный в функции timeEstimate, содержит ошибку. Он указывает, что функция timeEstimate не принимает никаких аргументов. Не используйте прототипы функций Perl, пока точно не поймете, почему их нужно использовать.

Наконец, ваше использование sprintf не требуется. Строка может быть переписана как:

my $stuff = 0.2045 * ($number ** 3);
1 голос
/ 03 июля 2010

Ваша проблема с прототипом подпрограммы - у вас есть пустой список аргументов, но вы вызываете его с одним аргументом.

Сделайте timeEstimate ($), и все будет в порядке.Затем вызовите «timeEstimate (10)» или как угодно.

Однако я не вижу, как вы могли бы запустить его, не получив сообщение об ошибке.

0 голосов
/ 03 июля 2010

Код в вашем вопросе имеет семантическую ошибку. Вы должны начать это с

sub timeEstimate {  # no parens!

Вы забыли передать аргумент timeEstimate? Называя это как

timeEstimate 3;

дает следующий вывод:

Number: 3
stuff: 5.5215
totalDownloads: 17.5215
secondPerFile: 0.4464
totalSeconds: 7.8215976
totalHours: 0.002172666
0 голосов
/ 03 июля 2010
perl -e '$var = "0.123"; print sprintf("%02.5f\n", $var);'
0.12300

sprintf отлично работает с десятичными числами.

Edit:

Похоже, вы также не использовали "use strict", что поможет с любыми опечатками имен переменных.И я бы исключил () из объявления функции.

...