繁体   English   中英

ActiveState Perl 5.14无法比较某些值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM