变量似乎强制Perl中的整数答案

变量似乎强制Perl中的整数答案,perl,Perl,我有一个用Perl计算的数字,一旦我从子程序中得到它并进行乘法,我就用它来找到另一个数字,第二个数字总是一个向下取整的整数 这是我的密码: $gap = timediff($date, $next); $gap = ($gap / 60) / 24; $total = $total + $amt; $time = $gap/365; print "Gap: $gap, time: $time\n"; 每当我运行这个时,$time的答案总是0。(我正在处理时间段,目前,它总是少于一年。)因此我添

我有一个用Perl计算的数字,一旦我从子程序中得到它并进行乘法,我就用它来找到另一个数字,第二个数字总是一个向下取整的整数

这是我的密码:

$gap = timediff($date, $next);
$gap = ($gap / 60) / 24;
$total = $total + $amt;
$time = $gap/365;
print "Gap: $gap, time: $time\n";
每当我运行这个时,$time的答案总是0。(我正在处理时间段,目前,它总是少于一年。)因此我添加了另一个打印声明:

print "Compute: ".($gap/365).", Calc test: ".($gap * .72)."\n";
两个答案我都得0分

在第二次计算中(在“Calc Test:”之后),我使用了加法、除法、减法和乘法,以及用不同的数字替换.72。如果我除以,答案总是一个向下取整的整数

我还包括它调用的timediff()和unhtime()的代码。timediff()实现了您所期望的功能,它计算两次之间经过的时间。unhtime()花费时间,将其从我有时使用的格式(yyyy-mm-dd-hhmmss)转换为刻度。在本例中,我将向它传递没有hhmmss部分的日期(Perl通过不返回字符串中不存在的部分的任何内容来很好地处理)。我用它得到了准确的结果,但我以前从未处理过小数,在这个过程中的某个时刻,某个因素影响着一个数字,不仅迫使它成为一个整数,而且迫使以后用它进行的任何计算返回整数

sub timediff {
my ($now, $then, $diff);
($now, $then) = @_;
$now = unhtime($now);
$then = unhtime($then);
$diff = int(($then - $now) / 60);
return $diff;
}

sub unhtime {
my $start = shift(@_);
if (!$start) {$start = humantime();}
$start =~ s/-//g;
my $year = substr($start, 0, 4);
my $month = substr($start, 4, 2);
my $day = substr($start, 6, 2);
my $hour = substr($start, 8, 2);
my $min = substr($start, 10, 2);
my $sec = substr($start, 12, 2);
$year = $year - 1900;
$month--;
my $now = timelocal($sec, $min, $hour, $day, $month, $year);
return $now;
}

(timelocal来自时间::本地。)


为什么我使用$gap的任何操作都被强制向下舍入整数答案?

timediff中的代码强制此整数舍入:

...
$diff = int(($then - $now) / 60);
perldoc-f int

返回EXPR的整数部分。如果省略EXPR,则使用 $_. 您不应将此函数用于舍入:1,因为 它向0和2截断,因为机器表示 浮点数的数目有时会产生 违反直觉的结果


Re“为什么我使用$gap的任何操作都被强制向下舍入整数答案?”不太可能。请对这个问题给出一个最小的、可运行的演示。@ikegami不太可能:可能有一个
使用整数
吗?@ikegami:我想如果Perl中有什么东西强制整数结果为字符串,然后强制整数,那么,我发布的任何代码实际上都是无关紧要的。@SlavenRezic:我在我的模块中不使用任何代码。如果在我调用的另一个模块中使用了一个,这会对返回到代码中的结果产生影响吗?如果是这样的话,我能做些什么来抵消这种影响?@Tango:
use integer
是一个pragma,所以它在词汇范围内。这意味着:如果你看不到它,那么它对你的代码没有任何影响。所以一旦我使用int(),从那时起,这个数字就会产生整数结果?有没有办法改变这一点?一旦我使用int(),我以后如何强制将该变量视为浮点?@Tango你不能。一旦将整数部分指定给
$diff
,表达式
($then-$now)/60
中的任何额外信息都将永远丢失。您可以将两者(整数部分和浮点数)作为数组返回:
$diff=($then-$now)/60;return($diff,int$diff)
然后我可以编辑该例程。我不会使用int(),而是使用正则表达式来删除小数点以及之后的任何内容。只是尝试了另一种方法。得到结果后,我添加了:$gap=“$gap.00”;在那之后,它被视为一个浮点。Re:“所以一旦我使用int(),从那时起,这就迫使那个数字产生整数结果”,一点也不<代码>perl-E'say int(4)*0.1'打印0.4