Board logo

标题: [其他] 【已解决】批处理IF 里面的 LSS LEQ 这些有限制吗?这是为啥? [打印本页]

作者: hnfeng    时间: 4 天前 13:15     标题: 【已解决】批处理IF 里面的 LSS LEQ 这些有限制吗?这是为啥?

当大于 11位数时,LSS 明显错误,LEQ 正确,数字再大,之后 LEQ 也错误了
  1. N:\>if 100000000 LSS 200000000 (@echo L) else (@echo x)
  2. L
  3. N:\>if 100000000 LEQ 200000000 (@echo L) else (@echo x)
  4. L
  5. N:\>if 1000000000 LSS 2000000000 (@echo L) else (@echo x)
  6. L
  7. N:\>if 1000000000 LEQ 2000000000 (@echo L) else (@echo x)
  8. L
  9. N:\>if 10000000000 LSS 20000000000 (@echo L) else (@echo x)
  10. x
  11. N:\>if 10000000000 LEQ 20000000000 (@echo L) else (@echo x)
  12. L
  13. N:\>if 100000000000 LSS 200000000000 (@echo L) else (@echo x)
  14. x
  15. N:\>if 100000000000 LEQ 200000000000 (@echo L) else (@echo x)
  16. L
  17. N:\>if 1000000000000 LEQ 2000000000000 (@echo L) else (@echo x)
  18. L
  19. N:\>if 10000000000000 LEQ 20000000000000 (@echo L) else (@echo x)
  20. L
  21. N:\>if 3000000000000000 LEQ 2000000000000000 (@echo L) else (@echo x)
  22. L
复制代码

作者: aloha20200628    时间: 4 天前 13:31

回复 1# hnfeng

批处能处理的正整数区间=0-2147483647。

作者: hnfeng    时间: 4 天前 13:43

回复  hnfeng

批处能处理的正整数区间=0-2147483647。
aloha20200628 发表于 2024-9-25 13:31



   谢谢。那么能否推荐一个计算大数值的方法或第三方?主要用来比较两个大数值
作者: aloha20200628    时间: 4 天前 14:37

本帖最后由 aloha20200628 于 2024-9-26 11:06 编辑

回复 3# hnfeng

批处中直接调用powershell代码完成大数计算(包括浮点计算)和比对最简单,如下
  1. @echo off
  2. set "a=123456789012345"
  3. set "b=987654321098765"
  4. for /f %%v in (
  5.    'powershell "if(%a%/%b% -eq %b%/%a%){1}else{-1}" '
  6. ) do if %%v equ 1 (echo,yes) else (echo,no)
  7. pause&exit/b
复制代码
其中,返回值=1 表示 true=yes=是, 返回值=-1 表示 false=no=否
-eq 是 powershell 采用的比较运算符,全集详见 https://learn.microsoft.com/zh-c ... view=powershell-7.4

作者: hnfeng    时间: 4 天前 15:00

回复  hnfeng

批处中直接调用powershell代码最简单,如下其中,返回值=1 表示 true=yes=是, 返回值=-1  ...
aloha20200628 发表于 2024-9-25 14:37



    谢谢。
但是windows2003里面用不了powershell
暂且用 BatCalc.exe 把数值减小来解决了
作者: qixiaobin0715    时间: 4 天前 15:25

本帖最后由 qixiaobin0715 于 2024-9-25 15:53 编辑

如果单纯比较数值大小,可以把运算符两边的数字预先处理一下,把它当成字符串来比较。比如将数字都预先处理为20个字符,不足20个前面用零补齐,然后再比较,前后数字位数相同不用处理。
1234567890处理为00000000001234567890
  1. if "00000000001234567890" LEQ "20000000000000000000" (@echo L) else (@echo x)
  2. if "3000000000000000" LEQ "2000000000000000" (@echo L) else (@echo x)
复制代码

作者: Five66    时间: 4 天前 21:18

用其他语言进行拓展
自带的就用vbs或jscript
第三方用lua或nodejs(只需主程序)
作者: hnfeng    时间: 3 天前 08:00

如果单纯比较数值大小,可以把运算符两边的数字预先处理一下,把它当成字符串来比较。比如将数字都预先处理 ...
qixiaobin0715 发表于 2024-9-25 15:25



    这种方法确实不错,简单实用,谢谢




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