下面的脚本计算了十进制数的时间差,但我得到了一个舍入错误,所以我猜这是因为我最后的转换非常糟糕。
问题
有些东西告诉我,表达式可以简化,但是在这种特定情况下,当我有 int
、模数和除法时,数学规则是什么?
#!/usr/bin/perl
print f("9:00", "16:45");
sub f {
my $t1 = shift @_;
my $t2 = shift @_;
my $m1 = $1*60+$2 if $t1 =~ m/(\d\d?):(\d\d?)/;
my $m2 = $1*60+$2 if $t2 =~ m/(\d\d?):(\d\d?)/;
my $h = int(($m2-$m1)/60);
return $h + ($h*60+$m2-$m1)%60/60;
}
最佳答案
您已经正确计算了 $m1
和 $m2
自午夜以来经过的分钟数。那么为什么不简单地以小数小时返回时差:
return ($m2 - $m1) / 60.0;
就“数学规则”而言,查看您的返回值
与我的值并了解它们为何相同(忽略四舍五入)可能会有所帮助:
$h + ($h * 60 + $m2 - $m1) % 60 / 60
请注意 ($h * 60) % 60
为零,因此该术语基本上被删除,留下:
$h + ($m2 - $m1) % 60 / 60
现在想想 $h
是如何计算的:它是 ($m2 - $m1)
除以 60 的商,去掉余数(因为 int()
)。另一方面,($m2 - $m1) % 60
正好是这个除法的余数。所以上面的表达式本质上只是将你从 $h
中删除的余数加回来。因此它与
($m2 - $m1) / 60
关于algorithm - 如何用 "int"、模数和除法简化表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22184598/