[英]ActiveState Perl 5.14 fails to compare certain values?
基本上,在文件流上使用以下代码,我得到以下信息:
$basis = $2 * 1.0;
$cost = ($basis - 2500.0) ** 1.05;
# The above should ensure that both cost & basis are floats
printf " %f -> %f", $basis, $cost;
if ($basis gt $cost) { # <- *** THIS WAS MY ERROR: gt forces lexical!
$cost = $basis;
printf " -> %f", $cost;
}
输出:
10667.000000 -> 12813.438340
30667.000000 -> 47014.045519
26667.000000 -> 40029.842300
66667.000000 -> 111603.373367 -> 66667.000000
8000.000000 -> 8460.203780
10667.000000 -> 12813.438340
73333.000000 -> 123807.632158 -> 73333.000000
6667.000000 -> 6321.420427 -> 6667.000000
80000.000000 -> 136071.379474 -> 80000.000000
如您所见,对于大多数值,该代码似乎可以正常工作。
但是对于某些值...。66667、80000和其他一些值,ActivePerl 5.14告诉我66667> 1111603!
是否有人对此有任何了解-或有可能要使用的备用Perl解释器(Windows)。 因为这很荒谬。
您正在使用词汇比较而不是数值比较
$cost = ($basis - 2500.0) ** 1.05;
printf " %f -> %f", $basis, $cost;
if ($basis > $cost) {
$cost = $basis;
printf " -> %f", $cost;
}
ps:修订以匹配更新的问题
Learning Perl的前几章将为您解决这一问题。 标量值可以是字符串或数字,也可以同时是两者。 Perl使用运算符来决定如何对待它们。 如果要进行数字比较,请使用数字比较运算符。 如果要进行字符串比较,请使用字符串比较运算符。
标量值本身没有类型,尽管使用了诸如“ float”和“ cast”之类的其他答案和注释。 只是字符串和数字。
不确定为什么需要比较词法,但是可以使用sprintf强制进行比较
$basis_real = sprintf("%015.6f",$basis);
$cost_real = sprintf("%015.6f",$cost);
printf " %s -> %s", $basis_real, $cost_real;
if ($basis_real gt $cost_real) {
$cost = $basis;
printf " -> %015.6f", $cost;
}
输出:
00010667.000000 -> 00012813.438340
00030667.000000 -> 00047014.045519
00026667.000000 -> 00040029.842300
00066667.000000 -> 00111603.373367
00008000.000000 -> 00008460.203780
00010667.000000 -> 00012813.438340
00073333.000000 -> 00123807.632158
00006667.000000 -> 00006321.420427 -> 00006667.000000
00080000.000000 -> 00136071.379474
正如您指出的那样,它之所以失败,是因为词法比较会进行字符对字符的比较,因此当它达到6667.
的小数点时,实际上是按字母顺序在111603.
之前,因此更大。
要解决此问题,必须使所有数字的大小相同,尤其是在小数点对齐的地方。 %015是数字的总大小,包括句点和小数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.