Board logo

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

作者: kingshui    时间: 2016-3-25 18:00     标题: 【已解决】为什么if比较两个大数字的大小会出现误判/判断错误/有误?

本帖最后由 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:\>
复制代码

作者: 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

  1. 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窗口下运行,以批处理文件运行需将%替换成%%
  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
复制代码

作者: 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
  1. @echo off
  2. powershell -c "Get-ChildItem -Recurse -Path 'D:\' *.pst | %{if($_.Length -ge 20222222222){$_.Name + " " + $_.Length}}"
  3. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2