首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveState Perl 5.14无法比较某些值?

ActiveState Perl 5.14无法比较某些值?
EN

Stack Overflow用户
提问于 2012-02-24 13:03:08
回答 3查看 106关注 0票数 1

基本上,在文件流上使用以下代码,我会得到以下结果:

代码语言:javascript
复制
$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;
}

输出:

代码语言:javascript
复制
  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)。因为这太荒谬了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-24 13:09:51

您正在使用词法比较,而不是数字比较

代码语言:javascript
复制
$cost = ($basis - 2500.0) ** 1.05;
printf "  %f -> %f", $basis, $cost;
if ($basis > $cost) {
    $cost = $basis;
    printf " -> %f", $cost;
}

ps:已修改以匹配更新后的问题

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 00:57:39

学习Perl的前几章将为您阐明这一点。标量值可以是字符串或数字,也可以同时是这两者。Perl使用运算符来决定如何处理它们。如果要进行数值比较,请使用数值比较运算符。如果要进行字符串比较,可以使用字符串比较运算符。

标量值本身没有类型,尽管其他答案和注释使用了"float“和"cast”等词。这只是字符串和数字。

票数 3
EN

Stack Overflow用户

发布于 2012-02-24 15:14:48

不确定为什么需要将其与词法进行比较,但可以使用sprintf强制进行比较

代码语言:javascript
复制
$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;
}

输出:

代码语言:javascript
复制
  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是数字的总大小,包括句点和小数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9425669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档