首页 > 解决方案 > perl 中带有前缀 0 数字的错误

问题描述

当我尝试执行以下操作时(01434.210 instead of 1434.210)

$val=22749.220-(21315.010+01434.210)
print $val

我得到这些输出

output 638.207900000001

但根据我的输出必须是0.

我错过了什么?

标签: perl

解决方案


字面数字中的前导 0 使 Perl 解释值 I 以 8 为基数:

 123   # 123, in decimal
0123   # 123 in octal, but 83 in decimal

这对于转换为数字的字符串是不一样的。在那些 Perl 中忽略了前导 0。字符串到数字的转换只处理 base-10:

 "123" + 0   # 123
"0123" + 0   # still 123

在评论中的示例中,您将文字数字转换为带有前导零的字符串。当您将该字符串转换回其数字形式时,您会得到与开始时相同的值:

$val=sprintf("%05d",1434);   # converting 1434 to the string "01434"
print $val; print "\n";      # still a string
print $val+21315;            # "01434" + 21315 => 1434 + 21315
print "\n"; 
print 01434+21315;           # oct(1434) + 21315 => 796 + 21315

前导零符号有助于某些通常使用八进制数的内置函数,例如那些处理 unix 权限的函数:

chmod 0644, @files

推荐阅读