找回密码
 加入
搜索
楼主: duanqs

[网络通信] [以解决+远超预期]"四舍五入"无法搞定?

 火... [复制链接]
发表于 2015-3-16 12:30:50 | 显示全部楼层
回复 59# netegg

这个我是知道的,上面的代码
MsgBox(0,Round(9.855,2),8.03 - 7.98)
   
我想说的就是这样,第二个参数表明了,不是au3的"舍入"有问题(有些正确,有些不正确),第三个参数显示它的原因:无法准确表达浮点数
IEEE都不解决,C语言不解决,所以即使反馈官方,au3估计也不可能去解决,否则它就需要自己去处理判断,不能直接使用C的好多函数了,这样的话,以后涉及的数值运算速度必定大大降低,得不偿失....
发表于 2015-3-16 12:33:06 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 13:16 编辑

回复 61# annybaby
c语言好像解决了,昨天不是在群里问过llround的事吗,就是干这个使的,我没学过c,不太清楚怎么用
long long int llround  (double x);
long long int llroundf (float x);
long long int llroundl (long double x);
c99里的定义
header
<cmath> (math.h)
api里好像有,不过不知道怎么调,需要用cdecl什么玩意,好像是
好像在msvcrt里还是在mscrt里面有
 楼主| 发表于 2015-3-16 13:16:52 | 显示全部楼层
昨天没有上网, 刚看到帖子.
被热情洋溢的谈论和高招, 感动得老泪横流.  
帖子里的论坛元老和金牌会员太值得俺敬仰了. 名字就不点了.
深鞠一躬!
发表于 2015-3-16 14:18:38 | 显示全部楼层
回复 61# annybaby
round函数不是有时正确有时不正确,要取决于保留位的前一位是什么
发表于 2015-3-16 14:54:09 | 显示全部楼层
回复 64# netegg

不是由一位决定的,要转成2进制,没那么简单的规律...
发表于 2015-3-16 14:59:26 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 15:21 编辑

回复 65# annybaby
看资料了,就是和前一位有关,如果是奇数进位,偶数不进(或者记反了),其实也是二进制,看前一位是1结尾还是0结尾。主要是要定位的那一位是5,前面不一样就不一样
发表于 2015-3-16 15:40:45 | 显示全部楼层
回复 66# netegg

不是的,我58楼已经回复你了,那两个都进位...
发表于 2015-3-16 15:44:55 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 15:46 编辑

怎么可能,那两个数的二进制是多少,用32位的话,最后都是0,去哪进位
发表于 2015-3-16 17:05:50 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 19:42 编辑

懒得细算了 ,大概是这样
.586转成二进制是.10010110000001000001100010010011011101001011110001101
.585转成二进制是.10010101110000101000111101011100001010001111010111
.584转成二进制是.10010101100000010000011000100100110111010010111100011
.005转成二进制是.000000010100011110101110000101000111101011100001010001111011
  .59转成二进制是.10010111000010100011110101110000101000111101011100001
  .58转成二进制是.10010100011110101110000101000111101011100001010001111
对了,我指的进位不是十进制的奇数偶数,是二进制的0/1
发表于 2015-3-16 20:49:28 | 显示全部楼层
考虑不了那么多,直接上js吧

msgbox(0,"",rounds(698.1556,2))



Func Rounds($num,$n)
        $JS = ObjCreate("ScriptControl")
        $JS.language = "jscript"
        $JS.addcode("function rd(a,n){var strs=a ;return strs.toFixed(n);}")
        Return $JS.Eval("rd("&$num&","&$n&")")
EndFunc 
发表于 2015-3-16 21:01:39 | 显示全部楼层
回复  annybaby
捣什么乱,前面都讨论过了
round函数最大的问题在于,保留位数的后一位如果是5,所要保留 ...
netegg 发表于 2015-3-16 11:49


蛋哥,做技术的告诉你,天朝有标准规定的:

标准:GB/T 8170-2008 数值修约规则与极限数值的表示和判定

节选:




通俗点解释:
一.保留位(精确位)后一位为4时,舍去,如1.4≈1
二.保留位(精确位)后一位为6时,保留位+1,如4.6≈5
上面这两个不用解释了,通俗讲就是四舍六入
三.保留位(精确位)后一位为5时,有两种情况
1.保留位后一位为5且后面有数值时,保留位+1,如4.451≈4.5/3.51≈4 (有点像我们通常说的四舍五入)
2.保留位后一位为5且后面为空或者0时,由保留位奇偶确定如何修约,

若保留位为奇数,则保留位+1,如3.550≈3.6/1.5≈2
若保留位为偶数,则舍去后面部分,如2.50≈2/8.45≈8.4

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-3-17 00:10:22 | 显示全部楼层
本帖最后由 netegg 于 2015-3-17 00:21 编辑

对呀,就是这样啊,可是计算机又不是人,转换为二进制后的值是有限制的,这个用人算当然没问题,交给计算机,你怎么判断奇偶性,换句话说,保留位的下一位是5的话要判断两边的值,而不是一边,而0~4/6~9只要判断数字本身就行了,至于是否正确不知道,你看看前面*.(1~9)55的round两位的图就知道了
交给电脑的话,只会接收二进制,剩下的做法只有靠自己了,可是电脑对数位的限制只有那么多,不会都识别出来的
发表于 2015-3-17 00:20:10 | 显示全部楼层
哈哈,数学问题,大神真多,各种理论、规定、二进制啊,不过也学到了不少知识啊,试试这个数学方法:
你要保留两位小数,就在第3位 +5,即 +0.005,然后再 round 看看,本问题甚至只 +0.001 即可,本人未实际试,理论上应该对的,错了管换啊,保证解决问题,懒啊,等待结果中......
发表于 2015-3-17 00:22:47 | 显示全部楼层
本帖最后由 netegg 于 2015-3-17 00:25 编辑

回复 73# iva
错,保留三位要加也是加0.0001,如果加0.001原来就是0.**4怎么出来,还不是要出来个.005
发表于 2015-3-17 00:27:28 | 显示全部楼层
回复 70# gto250
那个不用js,c语言里有现成的处理方式,不过我不会
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 16:49 , Processed in 0.070573 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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