annybaby
发表于 2015-3-16 12:30:50
回复 59# netegg
这个我是知道的,上面的代码
MsgBox(0,Round(9.855,2),8.03 - 7.98)
我想说的就是这样,第二个参数表明了,不是au3的"舍入"有问题(有些正确,有些不正确),第三个参数显示它的原因:无法准确表达浮点数
IEEE都不解决,C语言不解决,所以即使反馈官方,au3估计也不可能去解决,否则它就需要自己去处理判断,不能直接使用C的好多函数了,这样的话,以后涉及的数值运算速度必定大大降低,得不偿失....
netegg
发表于 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里面有
duanqs
发表于 2015-3-16 13:16:52
昨天没有上网, 刚看到帖子.
被热情洋溢的谈论和高招, 感动得老泪横流.
帖子里的论坛元老和金牌会员太值得俺敬仰了. 名字就不点了.
深鞠一躬!
netegg
发表于 2015-3-16 14:18:38
回复 61# annybaby
round函数不是有时正确有时不正确,要取决于保留位的前一位是什么
annybaby
发表于 2015-3-16 14:54:09
回复 64# netegg
不是由一位决定的,要转成2进制,没那么简单的规律...
netegg
发表于 2015-3-16 14:59:26
本帖最后由 netegg 于 2015-3-16 15:21 编辑
回复 65# annybaby
看资料了,就是和前一位有关,如果是奇数进位,偶数不进(或者记反了),其实也是二进制,看前一位是1结尾还是0结尾。主要是要定位的那一位是5,前面不一样就不一样
annybaby
发表于 2015-3-16 15:40:45
回复 66# netegg
不是的,我58楼已经回复你了,那两个都进位...
netegg
发表于 2015-3-16 15:44:55
本帖最后由 netegg 于 2015-3-16 15:46 编辑
怎么可能,那两个数的二进制是多少,用32位的话,最后都是0,去哪进位
netegg
发表于 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
gto250
发表于 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 http://www.autoitx.com/images/common/back.gif
蛋哥,做技术的告诉你,天朝有标准规定的:
标准: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
netegg
发表于 2015-3-17 00:10:22
本帖最后由 netegg 于 2015-3-17 00:21 编辑
对呀,就是这样啊,可是计算机又不是人,转换为二进制后的值是有限制的,这个用人算当然没问题,交给计算机,你怎么判断奇偶性,换句话说,保留位的下一位是5的话要判断两边的值,而不是一边,而0~4/6~9只要判断数字本身就行了,至于是否正确不知道,你看看前面*.(1~9)55的round两位的图就知道了
交给电脑的话,只会接收二进制,剩下的做法只有靠自己了,可是电脑对数位的限制只有那么多,不会都识别出来的
iva
发表于 2015-3-17 00:20:10
哈哈,数学问题,大神真多,各种理论、规定、二进制啊,不过也学到了不少知识啊,试试这个数学方法:
你要保留两位小数,就在第3位 +5,即 +0.005,然后再 round 看看,本问题甚至只 +0.001 即可,本人未实际试,理论上应该对的,错了管换啊,保证解决问题,懒啊,等待结果中......
netegg
发表于 2015-3-17 00:22:47
本帖最后由 netegg 于 2015-3-17 00:25 编辑
回复 73# iva
错,保留三位要加也是加0.0001,如果加0.001原来就是0.**4怎么出来,还不是要出来个.005
netegg
发表于 2015-3-17 00:27:28
回复 70# gto250
那个不用js,c语言里有现成的处理方式,不过我不会