[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 为什么解题的bat代码结果比正确答案少1

下面的程序用于解答:x-28=x/5,x=?,正确答案是x=35,但是我的bat代码运行后显示:34-28=34/5,应该是35而不是34,代码如下,我并不是想要这个程序帮我解这个题,而是想弄明白出问题的机制,以便以后注意。代码如下:@echo off
  1. set x=0
  2. :loop
  3. set /a x=x+1
  4. set /a xj=x-28
  5. set /a xxj=x/5
  6. if %xj% equ %xxj%=goto endloop
  7. goto loop
  8. :endloop
  9. echo %x%-28=%x%/5
  10. pause
复制代码
一个六年级小学生,请多指教

  1. @echo off
  2. set /a n=34/5
  3. echo %n%
  4. pause
复制代码
bat小白,请多指教!谢谢!

TOP

回复 1# LTSC1809


    cmd计算无法精确到小数点,34/5应该是6.8但是.8被省略了就出现这种情况
QQ 1980286392

TOP

本帖最后由 pd1 于 2023-7-19 17:58 编辑
  1. @echo off
  2. set x=0
  3. :loop
  4. set /a x=x+1
  5. set /a xj=x-28
  6. set /a xxj=x/5
  7. echo %x%    %xj%      %xxj%
  8. if %xj% equ %xxj%=goto endloop
  9. goto loop
  10. :endloop
  11. echo %x%-28=%x%/5
  12. pause
复制代码
  1. @echo off
  2. set x=0
  3. :loop
  4. set /a x=x+1
  5. set /a xj=(x-28)*5
  6. set /a xxj=x
  7. if %xj% equ %xxj%=goto endloop
  8. goto loop
  9. :endloop
  10. echo %x%-28=%x%/5
  11. pause
复制代码

TOP

你的批处理代码如下:
```batch  
@echo off  
set /p x="请输入一个数字:"  
set /a x=x-28  
set /a x=x*5  
echo %x%  
pause  
```
这段代码的作用是读取用户输入的数字,将其减去 28,然后乘以 5,最后输出结果。
问题出在第二行,你应该使用以下代码:
```batch  
set /a x=x-28  
```
而不是:
```batch  
set /a x=x-28  
set /a x=x*5  
```
这两行代码会同时执行,导致 `x` 的值先被减去 28,然后又被乘以 5。正确的做法是先完成减法运算,再进行乘法运算。
修改后的代码如下:
```batch  
@echo off  
set /p x="请输入一个数字:"  
set /a x=x-28  
set /a x=x*5  
echo %x%  
pause  
```
现在,当您运行此批处理文件并输入 35 时,它将输出 35。

TOP

回复 5# 447219071


    是不是抄错了?修改前和修改后的代码一样
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

感谢大家的帮助,看完感觉批处理不支持浮点数这个问题确实没啥好的解决办法,我再逐个试一试,看看问题是否解决!
一个六年级小学生,请多指教

TOP

回复 4# pd1


    你这个还是得出34-28=34/5,正确的应该是35-28=35/5(我用VBScript试验过,确实是这个结果)
一个六年级小学生,请多指教

TOP

回复 8# LTSC1809

第一个我没改,只是输出xxj说明不对的原因
第二个还是得到34?确定吗?

TOP

一定要用批处理来做这种事情
set /a m=x%%5
然后,
if %xj% equ %xxj% if %m%==0 goto endloop

TOP

返回列表