标题: [数值计算] 【已解决】为什么if比较两个大数字的大小会出现误判/判断错误/有误? [打印本页]
作者: kingshui 时间: 2016-3-25 18:00 标题: 【已解决】为什么if比较两个大数字的大小会出现误判/判断错误/有误?
本帖最后由 pcl_test 于 2017-4-10 13:55 编辑
麻烦帮忙看下下面的输出结果及命令,我有点迷胡了。有人可以解释一下为什么会有if 2822439936 GEQ 20222222222 echo yes
yes这个么?明显的没有后面的数值大啊。- C:\>for /f "delims=" %a in ('dir /a/s/b d:\*.pst') do if %~za geq 20222222222 ec
- ho yes
-
- C:\>if 79250432 GEQ 20222222222 echo yes
-
- C:\>if 271360 GEQ 20222222222 echo yes
-
- C:\>if 38618112 GEQ 20222222222 echo yes
-
- C:\>if 514778112 GEQ 20222222222 echo yes
-
- C:\>if 20220691456 GEQ 20222222222 echo yes
- yes
-
- C:\>if 2822439936 GEQ 20222222222 echo yes
- yes
-
- C:\>if 146293760 GEQ 20222222222 echo yes
-
- C:\>if 271360 GEQ 20222222222 echo yes
-
- C:\>if 271360 GEQ 20222222222 echo yes
-
- C:\>if 95503360 GEQ 20222222222 echo yes
-
- C:\>
复制代码
作者: happy886rr 时间: 2016-3-25 18:05
本帖最后由 happy886rr 于 2016-3-25 18:07 编辑
回复 1# kingshui
超过了就会溢出。也就是超过21亿多后就无法使用大小比较的语法了。你后边的数都200多亿了,早爆了。
作者: CrLf 时间: 2016-3-25 18:20
参数不能转换为 long int 类型时(-2147438648~+2141438647),就进行字符串比较
2822439936 GEQ 20222222222
实际上是先比较 2 和 2,再比较 8 和 0
作者: kingshui 时间: 2016-3-25 18:43
多谢两位,基础差了,回头再试下,用g来计算比较试下。
作者: codegay 时间: 2016-3-25 19:50
用powershell或者python之类的高级语言处理,过程会简单很多.
作者: CrLf 时间: 2016-3-25 20:24
- hash /z::20222222222 /a /s
复制代码
作者: pcl_test 时间: 2016-3-25 23:02
本帖最后由 pcl_test 于 2017-1-23 12:52 编辑
补0使两个数字位数相同再比较
if 02822439936 GEQ 20222222222 (echo;yes) else echo;No
cmd窗口下运行,以批处理文件运行需将%替换成%%- @(for /f "delims=" %a in ('dir /a-d/s/b d:\*.pst') do @echo;%a*%~za)|mshta "javascript:with(new ActiveXObject('Scripting.FileSystemObject')){var files=GetStandardStream(0).readall().split('\r\n');for(var i=0;i<files.length;i++){var f=files[i].split('*');if(f[1]>=20222222222)GetStandardStream(1).WriteLine(f.join('|')+'|YES')}}close()"|find /v ""
- @pause
复制代码
作者: kingshui 时间: 2016-3-28 09:53
回复 7# pcl_test
多谢,直接用了。
作者: Nsqs 时间: 2016-4-15 13:14
cmd
pcl_test 发表于 2016-3-25 23:02
本来调用外部命令还要写像2层for不理解.效率实在不堪入目
作者: CrLf 时间: 2016-4-15 13:58
回复 9# Nsqs
他只调用了三次外部命令
作者: Nsqs 时间: 2016-4-15 17:10
回复 10# CrLf
dir枚举文件算一次循环,调用js每次都需要启动mshta又用readall读文本是不对的.readall本身读取文件就需要耗费资源.在读取百万级大文本甚是需要几分钟到几十分钟不等.
加上for与split正则计算最后more,不算大文本就单纯重量级数量,效率实在堪忧
作者: pcl_test 时间: 2016-9-9 13:37
回复 11# Nsqs
mshta语句只对for语句输出的%a*%~za(文件*大小)进行处理,readall并不读取文本,效率只取决于dir的遍历查找和文件的数量
作者: GNU 时间: 2016-9-9 13:57
test.bat- @echo off
- powershell -c "Get-ChildItem -Recurse -Path 'D:\' *.pst | %{if($_.Length -ge 20222222222){$_.Name + " " + $_.Length}}"
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |