-2

我有一个用 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;

}

(本地时间来自 Time::Local。)

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

4

1 回答 1

2

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

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

来自perldoc -f int

返回 EXPR 的整数部分。如果省略 EXPR,则使用 $_。您不应该使用此函数进行舍入:一是因为它会截断为 0,二是因为浮点数的机器表示有时会产生违反直觉的结果。

于 2013-09-23T17:02:58.457 回答