我有一个用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测试:”之后),我使用了加法,除法,减法和乘法,以及用不同的数字替换.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来自Time :: Local。)
为什么我使用$ gap的操作被强制舍入整数答案?
答案 0 :(得分:2)
timediff
中的代码强制进行整数舍入:
...
$diff = int(($then - $now) / 60);
来自perldoc -f int
:
返回EXPR的整数部分。如果省略EXPR,则使用 $ _。你不应该使用这个函数进行舍入:一个因为 它截断为0,两个因为机器表示 浮点数有时会产生 违反直觉的结果。