简单:Perl如何在双打中工作?

时间:2010-07-02 21:01:00

标签: perl double decimal

我对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之外的任何东西。有人可以解释系统是如何工作的吗?

UPDATE-Solved:由于愚蠢的自我造成的错误。我有

use integer; 
代码中的

headdesk

4 个答案:

答案 0 :(得分:3)

声明变量并从函数中删除原型后,您的代码似乎可以正常工作:

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 :(得分:1)

你的问题在于子程序原型 - 你有一个空的参数列表,但是你用一个参数调用它。

让它时间精确($),你会没事的。然后叫“timeEstimate(10)”或其他什么。

但是我没有看到你如何在没有收到错误信息的情况下运行它。

答案 2 :(得分:0)

perl -e '$var = "0.123"; print sprintf("%02.5f\n", $var);'
0.12300

sprintf可以正常使用十进制数字。

编辑:

看起来你还没有使用“use strict”,这将有助于任何变量名称拼写错误。 我会从函数声明中删除()。

答案 3 :(得分:0)

您问题中的代码存在语义错误。你应该用

开始
sub timeEstimate {  # no parens!

您是否忘记将参数传递给timeEstimate?将其称为

timeEstimate 3;

给出以下输出:

Number: 3
stuff: 5.5215
totalDownloads: 17.5215
secondPerFile: 0.4464
totalSeconds: 7.8215976
totalHours: 0.002172666