![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 12:21 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论]脚本+算法=四舍五入,精确除法运算(申精) |
| 可打印版本 19,295 / 32 |
| 第16楼 bjsh | 发表于 2007-04-02 03:35 |
| 银牌会员 发帖 621 积分 2,000 | |
|
稍微简化了下代码
flyinspace兄的话我得好好想想 [ Last edited by bjsh on 2007-4-1 at 02:53 PM ] |
|
| 第17楼 flyinspace | 发表于 2007-04-02 03:49 |
| 银牌会员 发帖 517 积分 1,206 | |
|
我们换个算法。。
1,获取 被除数 / 除数 的结果。 2,获取 被除数 / 除数 的余数。 3,被除数 减去 余数 则为实际整除数。 3,若余数为0,则该数被整除。提示整除,后面输出几个0 4,若不为0,则 实际整除数 / 除数为 实际整数位的值(该值一定准确) 5,获取除数的位数。假设为2位。输出的小数点为7位。(两个值不能大于10) 6,使用循环 余数 * 10(10的9次方) 7,6的结果 / 除数 (然后利用4舍5入的算法)(给出提示)输出小数位 8,输出结果 : %整数位%.%小数位% 如此。精度也满足了。你的要求也达到了。 bjsh 觉得如何? |
|
| 第18楼 bjsh | 发表于 2007-04-02 04:06 |
| 银牌会员 发帖 621 积分 2,000 | |
|
flyinspace兄确实给了我提醒;
系统只能精确算出第九位; 也就是说最大精确值是八位; 所以我之前的算法在精确上对于数字较小的绝对没有问题; 比如18/7 但是在大数字上比如100000/7 精度要比前者小;也是和系统最大只能算到第九位有关; 所以在这方面采用flyinspace兄的建议; 先求出余数;把大数字化成小数字;在利用余数去继续除 |
|
| 第19楼 flyinspace | 发表于 2007-04-02 04:10 |
| 银牌会员 发帖 517 积分 1,206 | |
|
呵呵,觉得好的话给我加分吧:)
我是不是好赖皮 |
|
| 第20楼 bjsh | 发表于 2007-04-02 04:38 |
| 银牌会员 发帖 621 积分 2,000 | |
|
我要修正我前面的话
系统 数字精确度限为 32 位 所以第九位也不是确保算出来的; 例如 set /a p=4000000000/7 C:\>set /a p=4000000000/7 -42138185 所以第八为才是精确算出来的; 所以最后的精确度应为7位 |
|
| 第21楼 flyinspace | 发表于 2007-04-02 04:49 |
| 银牌会员 发帖 517 积分 1,206 | |
|
不过是一个long int的问题。。
精度就在这里啊。 set /a p=400000000 % 7 set /a a=400000000 - % p% set /a 整数部分=(400000000 - %a%) / 7 上面是一定整除的了。 怎么会9位不精确呢。。。。 |
|
| 第22楼 bjsh | 发表于 2007-04-02 04:53 |
| 银牌会员 发帖 621 积分 2,000 | |
|
新的代码 精度为7
|
|
| 第23楼 bjsh | 发表于 2007-04-02 04:55 |
| 银牌会员 发帖 621 积分 2,000 | |
|
flyinspace兄
说的有理啊 通过循环取余; 有可能任意精度啊 |
|
| 第24楼 bjsh | 发表于 2007-04-02 05:46 |
| 银牌会员 发帖 621 积分 2,000 | |
|
最终代码了;
精确到任何一位
[ Last edited by bjsh on 2007-4-1 at 06:40 PM ] |
|
| 第25楼 bjsh | 发表于 2007-04-02 05:49 |
| 银牌会员 发帖 621 积分 2,000 | |
|
这个代码的思想要归功于flyinspace
本想给他加十分;可惜论坛限制只能加两分.. 愿看过的各位 替我实现愿望 |
|
| 第26楼 bjsh | 发表于 2007-04-02 07:45 |
| 银牌会员 发帖 621 积分 2,000 | |
|
以前的那些突破了下限;
无法计算高于10^9次的下面这个经过修改后;突破了上下限; 可以计算任意位数字;并且可以精确到任意位数;(似乎太大比如1百万位会提示输出行太长)
[ Last edited by bjsh on 2007-11-22 at 10:30 PM ] |
|
| 第27楼 bjsh | 发表于 2007-04-02 08:01 |
| 银牌会员 发帖 621 积分 2,000 | |
|
无法解决除数大于10^9的问题
[ Last edited by bjsh on 2007-4-1 at 08:53 PM ] |
|
| 第28楼 flyinspace | 发表于 2007-04-02 09:26 |
| 银牌会员 发帖 517 积分 1,206 | |
Originally posted by bjsh at 2007-4-1 07:01 PM: 被除数 / 除数 = 结果中。 被除数是可以大于10的9次方的。。 但除数不可以。。 set 被除数=9999999999999999999999999999999 假设这个9有20位。。当然长度可以任意。。 使用 set new=%被除数:~0,9%取9位数出来。。 当然在应用级别的时候。。我们会用for循环解决连续值的问题。。 这里只说明一种情况。。其他的情况你自己搞定啊:) 首先判断 new 是否大于 除数 是--》大于则开始做取余运算。。。 假设除数是111111110。 然后按照上面的方法获得精确的值后。。 获取余数的位数。。 此例子为一位。。。值为9。。 然后在后面利用 set 补上8位。。 如此,循环。。。 把20位的数字全部取完。。 则整数部分的代码搞定了。。 小数部分你自己也会搞啦。。 |
|
| 第29楼 bjsh | 发表于 2007-04-02 09:49 |
| 银牌会员 发帖 621 积分 2,000 | |
|
我上面写错了;
是没法解决 除数大于 10^9 的问题; 至于被除数我最后一个代码用的思想和 flyinspace是一样的; 那段代码 对于被除数任意位都可以的 [ Last edited by bjsh on 2007-4-1 at 08:51 PM ] |
|
| 第30楼 nanhui112 | 发表于 2008-01-28 16:28 |
| 初级用户 发帖 59 积分 127 | |
|
;)特大数 我采取循环截取取数 但还是有问题 如123456789123456
先取前九位计算 后面再补0 把结果相加计算 有涉及到特大数相加的问题 并且结果也不是很正确 涉及到小数问题 一放大 就有很大数字差距了 看来 cmd 不适合计算 只能做到这个份拉~~~ ----前面的都是高手 学习拉 加倍努力拉:) [ Last edited by nanhui112 on 2008-1-28 at 04:43 PM ] |
|
| 上一页 1 2 3 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |