找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 32078|回复: 12

[数值计算] 【已解决】为什么if比较两个大数字的大小会出现误判/判断错误/有误?

[复制链接]
发表于 2016-3-25 18:00:33 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2017-4-10 13:55 编辑

麻烦帮忙看下下面的输出结果及命令,我有点迷胡了。有人可以解释一下为什么会有if 2822439936 GEQ 20222222222 echo yes
yes这个么?明显的没有后面的数值大啊。

  1. C:\>for /f "delims=" %a in ('dir /a/s/b d:\*.pst') do if %~za geq 20222222222 ec
  2. ho yes

  3. C:\>if 79250432 GEQ 20222222222 echo yes

  4. C:\>if 271360 GEQ 20222222222 echo yes

  5. C:\>if 38618112 GEQ 20222222222 echo yes

  6. C:\>if 514778112 GEQ 20222222222 echo yes

  7. C:\>if 20220691456 GEQ 20222222222 echo yes
  8. yes

  9. C:\>if 2822439936 GEQ 20222222222 echo yes
  10. yes

  11. C:\>if 146293760 GEQ 20222222222 echo yes

  12. C:\>if 271360 GEQ 20222222222 echo yes

  13. C:\>if 271360 GEQ 20222222222 echo yes

  14. C:\>if 95503360 GEQ 20222222222 echo yes

  15. C:\>
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2016-3-25 18:05:07 | 显示全部楼层
本帖最后由 happy886rr 于 2016-3-25 18:07 编辑

回复 1# kingshui
超过了就会溢出。也就是超过21亿多后就无法使用大小比较的语法了。你后边的数都200多亿了,早爆了。
发表于 2016-3-25 18:20:08 | 显示全部楼层
参数不能转换为 long int 类型时(-2147438648~+2141438647),就进行字符串比较

2822439936 GEQ 20222222222
实际上是先比较 2 和 2,再比较 8 和 0
 楼主| 发表于 2016-3-25 18:43:15 | 显示全部楼层
多谢两位,基础差了,回头再试下,用g来计算比较试下。
发表于 2016-3-25 19:50:16 | 显示全部楼层
用powershell或者python之类的高级语言处理,过程会简单很多.
发表于 2016-3-25 20:24:15 | 显示全部楼层
  1. hash /z::20222222222 /a /s
复制代码
发表于 2016-3-25 23:02:47 | 显示全部楼层
本帖最后由 pcl_test 于 2017-1-23 12:52 编辑

补0使两个数字位数相同再比较
if 02822439936 GEQ 20222222222 (echo;yes) else echo;No


cmd窗口下运行,以批处理文件运行需将%替换成%%
  1. @(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 ""
  2. @pause
复制代码
 楼主| 发表于 2016-3-28 09:53:14 | 显示全部楼层
回复 7# pcl_test

多谢,直接用了。
发表于 2016-4-15 13:14:07 | 显示全部楼层
cmd
pcl_test 发表于 2016-3-25 23:02



  本来调用外部命令还要写像2层for不理解.效率实在不堪入目
发表于 2016-4-15 13:58:24 | 显示全部楼层
回复 9# Nsqs


    他只调用了三次外部命令
发表于 2016-4-15 17:10:32 | 显示全部楼层
回复 10# CrLf

    dir枚举文件算一次循环,调用js每次都需要启动mshta又用readall读文本是不对的.readall本身读取文件就需要耗费资源.在读取百万级大文本甚是需要几分钟到几十分钟不等.
加上for与split正则计算最后more,不算大文本就单纯重量级数量,效率实在堪忧
发表于 2016-9-9 13:37:29 | 显示全部楼层
回复 11# Nsqs

mshta语句只对for语句输出的%a*%~za(文件*大小)进行处理,readall并不读取文本,效率只取决于dir的遍历查找和文件的数量
发表于 2016-9-9 13:57:35 | 显示全部楼层
test.bat
  1. @echo off
  2. powershell -c "Get-ChildItem -Recurse -Path 'D:\' *.pst | %{if($_.Length -ge 20222222222){$_.Name + " " + $_.Length}}"
  3. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:20 , Processed in 0.017173 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表