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

[AU3基础] 关于Floor、Ceiling、Round函数出错的问题

 火... [复制链接]
发表于 2015-3-17 13:49:22 | 显示全部楼层
回复  afan

当时觉得这头像有点逗就上传了,无意冒犯,望见谅
zldfsz 发表于 2015-3-17 13:38



    干嘛强调   话说 你这头像很好啊,挺适合你的…
发表于 2015-3-17 13:58:34 | 显示全部楼层
回复 16# afan


    哈哈,A大还真是幽默
 楼主| 发表于 2015-3-18 13:33:52 | 显示全部楼层
回复  afan
哪里没问题了,不是和我那篇帖子里写的那个类似吗,只不过他加入了对负数情况的判断,下面是你 ...
zldfsz 发表于 2015-3-17 08:39



    超过Int的取值范围了,看来我得发个取值范围的专题。
发表于 2015-3-18 16:29:48 | 显示全部楼层
回复 18# vuivui
你有病,而且不轻,得治
发表于 2015-3-19 11:26:13 | 显示全部楼层

评分

参与人数 2金钱 -24 贡献 -1 收起 理由
zhouhaijin -24
afan -1 警告,禁止纯表情!

查看全部评分

 楼主| 发表于 2015-3-19 13:10:28 | 显示全部楼层
回复  vuivui
你有病,而且不轻,得治
netegg 发表于 2015-3-18 16:29



第一次在本论坛生气。

我哪句话说错了?难道我说超过取值范围错了?发现问题发个专题讨论一下错了?

是啊,对你这样的人是不需要的,因为都论坛元老了,08年注册的,发了6348个帖子了。

在本帖一上来,就来句“10 ^ $dig,先不管其他的,这一下就不知道有没有问题”,是啊,先不管其他的,这一下就体现出你元老的水平来了。

afan兄、zldfsz兄都是动手编代码进行测试,而且都是有质量有深度的,你呢?

就拿zldfsz兄提出的例子说话,你知道123456155321234567.12345678加上123.456数值不变吗(au332位测试)?

MsgBox(4096, "超过取值范围出错示例:", 123456155321234567.12345678==123456155321234567.12345678+123.456)
上面的代码结果是“TRUE”,你觉得对这个保留两位小数四舍五入有意义吗?

解决办法是超过取值范围四舍五入无意义的数直接给出原值就行了,这就要知道取值范围、二进制的原理,我说要讨论一下这个问题,你说我病了。

发帖多,论坛活跃,这对au3论坛是有利的,但有些人发些低质量的帖是会误导初学者的,甚至“出口成脏”更是会阻碍论坛发展的。

评分

参与人数 1贡献 +20 收起 理由
zhouhaijin + 20 很棒的见解

查看全部评分

发表于 2015-3-19 19:02:18 | 显示全部楼层
本帖最后由 netegg 于 2015-3-19 21:34 编辑

回复 21# vuivui
大数计算不是没法解决,谁说的位数多不能计算,100!都照样全出来
不过,还是那个道理,10^100,au3能否算得出来,我还真没试过,不过math里有,_power(10,100)可以
下图是123456155321234567.12345678和123.456的加减乘除
说的是你用^这个运算符不是都适用,是有局限的,所以10^$dlg未必合适

本帖子中包含更多资源

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

×
发表于 2015-3-19 19:45:22 | 显示全部楼层
本帖最后由 netegg 于 2015-3-20 07:22 编辑

更何况,如果没记错==好像是字符串对比,前后都非空而且如果数字过长自动保留位数,岂不是变成true和true的比较了,返回当然是true
然后好好看看上面的对比,每一组第一行是运算名称,第二行是用+-*\,第三行是math udf里的函数
再说,只是就事论事,管它有没有实际意义,好比相对论,水星进动被证实前不是也没什么实际意义吗
另外你可以试试
MsgBox(4096, "超过取值范围出错示例:", 123456155321234567.12345678=123456155321234567.12345678+123.456)
或者这样
$string1 = '123456155321234567.12345678'
$string2 = String(Execute(123456155321234567.12345678+123.456))
MsgBox(4096, "超过取值范围出错示例:", $string1==$string2)
看看返回的是什么

本帖子中包含更多资源

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

×
发表于 2015-3-19 21:46:56 | 显示全部楼层
本帖最后由 netegg 于 2015-3-20 08:41 编辑

回复 21# vuivui
“你知道123456155321234567.12345678加上123.456数值不变吗(au332位测试)?”
这个我还真不知道,你自己测试过吗,用的语法是否正确,建议还是自己先确定了再说
多说一句,那和小数位数无关,不信的话
MsgBox(4096, "超过取值范围出错示例:", 10000000000000000000000000000==20000000000000000000000000000)
返回同样是true,不知道这个比较对于计算有没有意义?如果数字大没意义,是否可以直接写成1==2?
 楼主| 发表于 2015-3-20 09:57:33 | 显示全部楼层
回复  vuivui
大数计算不是没法解决,谁说的位数多不能计算,100!都照样全出来
不过,还是那个道理,10 ...
netegg 发表于 2015-3-19 19:02



谁跟你说位数多就不能计算?“10^100”au3怎么不能计算了?你都不测试不懂二进制计数原理,就哗哗哗发什么言?

你知道什么是信息量?内存提供一个数64位计数,最大整数只能是-9223372036854775807~9223372036854775807,如果是科学计数法,位数可以是很大,但小数的一部分超过内存提供的地址范围就位舍去,这就是123456155321234567.12345678加上123.456数值不变的原因。

现在讲的是au3,不要跟我扯其他的,数值范围跟cpu位数、系统的位数、编程语言、系统环境相关的,au3是c++编的,你要懂计数原理就得好好学学c语言数据原理。
发表于 2015-3-20 10:02:44 | 显示全部楼层
回复 25# vuivui
就是因为不扯其他的,所以我才会有此一问
发表于 2015-3-20 10:27:19 | 显示全部楼层
谁跟你说位数多就不能计算?“10^100”au3怎么不能计算了?你都不测试不懂二进制计数原理,就哗哗哗发 ...
vuivui 发表于 2015-3-20 09:57



    "数值范围跟cpu位数、系统的位数、编程语言、系统环境相关的"

那么写程序就一定要严谨,这是个大问题,不能说某一程序只能在某一特定的电脑上运行结果才准确
发表于 2015-3-20 10:28:31 | 显示全部楼层
本帖最后由 邪恶海盗 于 2015-3-20 10:29 编辑
谁跟你说位数多就不能计算?“10^100”au3怎么不能计算了?你都不测试不懂二进制计数原理,就哗哗哗发 ...
vuivui 发表于 2015-3-20 09:57




    "数值范围跟cpu位数、系统的位数、编程语言、系统环境相关的"

那么写程序就一定要严谨,这是个大问题,
如果写个程序只能在特定条件的电脑上运行结果才准确,那等于说没用,不如不写
 楼主| 发表于 2015-3-20 10:32:21 | 显示全部楼层
更何况,如果没记错==好像是字符串对比,前后都非空而且如果数字过长自动保留位数,岂不是变成true和true的 ...
netegg 发表于 2015-3-19 19:45



au3会自动转换数据类型,并不是说就不讲究数据类型。用字符串去进行数字计算,你知道效率会降多少吗?会出多少错吗?

$string1 = '123456155321234567.12345678'
$string2 = String(Execute(123456155321234567.12345678))
MsgBox(4096, Execute(123456155321234567.12345678+123.456), $string1==$string2)
都是123456155321234567.12345678也不会相等的。

元老同志,数字跟字符串是不一样的,String(Execute(123456155321234567.12345678))是一个科学计数法数字转换后的字符串,会跟字符串"123456155321234567.12345678"相等吗?

还是一句话,好好学学编程基础知识,慎发言,不要误导初学者。
 楼主| 发表于 2015-3-20 10:43:03 | 显示全部楼层
回复  vuivui
“你知道123456155321234567.12345678加上123.456数值不变吗(au332位测试)?”
这个我还 ...
netegg 发表于 2015-3-19 21:46


MsgBox(4096, "超过取值范围出错示例:", 10000000000000000000000000000==20000000000000000000000000000)

大哥,超过9223372036854775807的数字都是9223372036854775807,能不相等吗?
给你补补知识吧:
au3最大整数是64位,也就是:
0111111111111111111111111111111111111111111111111111111111111111
第一位0意思是正数。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 07:14 , Processed in 0.089615 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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