perl - perl 中带有前缀 0 数字的错误
问题描述
当我尝试执行以下操作时(01434.210 instead of 1434.210)
$val=22749.220-(21315.010+01434.210)
print $val
我得到这些输出
output 638.207900000001
但根据我的输出必须是0
.
我错过了什么?
解决方案
字面数字中的前导 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
推荐阅读
- ruby - Nil 类 Ruby 的未定义方法 .split
- python - 多目标的模型检测,但只尝试写一个
- xamarin.forms - 检测何时因关闭权限对话框而调用 OnResume
- testing - html-testrail 没有在 testcafe 中捕获失败的测试
- php - 在每个目录的 .htacess 中使用 SetHandler 设置特定的 PHP 版本不起作用
- ansible - Ansible如何在循环中忽略未定义的项目
- leaflet - 带有传单地图的 R Shiny 应用程序未以选定点为中心
- c# - 为什么即使有十进制数,第三列也为空?
- node.js - 节点 HTTP/2 设置托管证书的正确位置
- angular - ngrx 如何从存储中获取嵌套属性值