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

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

 火... [复制链接]
发表于 2015-3-15 16:52:23 | 显示全部楼层
本帖最后由 netegg 于 2015-3-15 16:54 编辑

回复 45# afan
没问题呀
[au3]Func a($num, $digital=0)
;        ConsoleWrite(StringLeft($num, StringInStr($num, '.') + $digital + 1)& @cr)
ConsoleWrite(StringLeft($num, StringInStr($num, '.'))  & stringtrimright(stringmid($num, Stringinstr($num, '.') + 1, $digital + 1) + 5, 1)& @cr)
endfunc[/au3]

本帖子中包含更多资源

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

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

[au3]ConsoleWrite(StringRegExpReplace(StringLeft($num, StringInStr($num, '.')) & stringtrimright(stringmid($num, Stringinstr($num, '.') + 1, $digital + 1) + 5, 1), '\.$', '')& @cr)[/au3]如果是0的话还是有些毛病.比如: a(80008.0944370186  ,3)
发表于 2015-3-15 17:43:23 | 显示全部楼层
回复 46# netegg


    改了当然这几个没问题…
发表于 2015-3-16 06:47:27 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 06:59 编辑

回复 48# afan
暂时ok了
[au3]Func _round($num, $dight)
        $dot = StringInStr($num, '.')
        If Not $dot Then Exit
        $str = StringRegExpReplace(StringLeft($num, $dot) & StringTrimRight(StringFormat("%0" & $dight + 1 & "s", StringMid($num, $dot + 1, $dight + 1) + 5), 1), '\.$', '')
        ConsoleWrite($num & @TAB & '(' & $dight & ')=====>' & @TAB & $str & @CR)
EndFunc   ;==>_round
[/au3]
现在能想到的问题还有一个,就是9.99保留1位,四舍五入是进还是不进,如果是进位的话可能还是个麻烦事

本帖子中包含更多资源

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

×
发表于 2015-3-16 09:47:24 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 11:12 编辑

应该是搞定了
[au3]_round(99664916.1723, 2)
_round(22167.662659362, 2)
_round(80008.0904370186, 3)
_round(13446071.1412964, 1)
_round(66299.703023, 2)
_round(48793.232120848, 3)
_round(6658.342, 0)
_round(611.8302451431, 3)
_round(1809.749, 1)
_round(74.516494, 3)
_round(93521004.371, 2)
_round(7.022, 1)
_round(9239844.3941, 2)
_round(8.1191, 0)
_round(315249.47112457, 0)
_round(20161.94779, 1)
_round(34024315.942693, 1)
_round(61247.25514, 3)
_round(7.21332948, 3)
_round(517822.741364284, 2)
_round(9.999, 1)
Func _round($num, $dight)
        $dot = StringInStr($num, '.') ;确定小数点位置
        If Not $dot Then Exit ;非小数退出(或返回错误,自定)
        $temp = StringLeft($num, $dot + $dight + 1)  ;取出整数位+保留位数+小数点位
        $temp = StringReplace($temp, '.', '') + 5  ;删除小数点,并进行要求保留位数的四舍五入
        $temp = StringTrimRight($temp, 1) ;删除多余的用于四舍五入的位数
        $right = StringRight($temp , $dight)  ;取出小数位
        $left = StringTrimRight($temp, $dight)  ; 删除小数位
        $str = StringRegExpReplace($left & '.' & $right, '\.$', '')  ;输出并删除结果以.为结尾(即仅保留整数的四舍五入)的.
        ;        $str =         StringRegExpReplace(StringLeft($num, StringInStr($num, '.'))& StringTrimRight(StringFormat("%0" & $dight + 1 & "s", StringMid($num, $dot + 1, $dight + 1) + 5), 1), '\.$', '')
        ConsoleWrite($num & @TAB & '(' & $dight & ')=====>' & @TAB & $str & @CR)
EndFunc   ;==>_round
[/au3]
afan再测试下

本帖子中包含更多资源

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

×
发表于 2015-3-16 11:10:02 | 显示全部楼层
回复 50# netegg


   
_Round(9.155, 2)
_Round(9.156, 2)
_Round(2.155, 2)
_Round(8.155, 2)
...
哥不玩了
发表于 2015-3-16 11:14:10 | 显示全部楼层
回复 51# afan

本帖子中包含更多资源

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

×
发表于 2015-3-16 11:29:29 | 显示全部楼层
还不错,两天搞定(加上修机器)
发表于 2015-3-16 11:30:32 | 显示全部楼层
回复 52# netegg

本帖子中包含更多资源

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

×
发表于 2015-3-16 11:39:18 | 显示全部楼层
本帖最后由 netegg 于 2015-3-19 20:47 编辑

负数的四舍五入,没考虑,科学记数法没有四舍五入一说,(就算是有那么也是前面的数字值的四舍五入,更何况科学计数法,本身就规定了,整数位必须是1`9, 小数位随便),完全不是数值计算,后面的e+015可以不要,这个根据实际情况拆一下就行了,还有就是最后那个-3,是什么意思,这个和四舍五入也没关系了,是格式化了,对了,整数是没有四舍五入的
发表于 2015-3-16 11:47:59 | 显示全部楼层
MsgBox(0,Round(9.855,2),8.03 - 7.98)
发表于 2015-3-16 11:49:09 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 11:54 编辑

回复 56# annybaby
捣什么乱,前面都讨论过了
round函数最大的问题在于,保留位数的后一位如果是5,所要保留位数的最后一位是偶数则进一,是奇数则不进,(或者反过来)
发表于 2015-3-16 12:05:59 | 显示全部楼层
回复 57# netegg

MsgBox(0,0,Round(3.585,2))
MsgBox(0,0,Round(3.575,2))
_round(8.03,2)
Func _round($num, $dight)
        $dot = StringInStr($num, '.') ;确定小数点位置
        If Not $dot Then Exit ;非小数退出(或返回错误,自定)
        $temp = StringLeft($num, $dot + $dight + 1)  ;取出整数位+保留位数+小数点位
        $temp = StringReplace($temp, '.', '') + 5  ;删除小数点,并进行要求保留位数的四舍五入
        $temp = StringTrimRight($temp, 1) ;删除多余的用于四舍五入的位数
        $right = StringRight($temp , $dight)  ;取出小数位
        $left = StringTrimRight($temp, $dight)  ; 删除小数位
        $str = StringRegExpReplace($left & '.' & $right, '\.$', '')  ;输出并删除结果以.为结尾(即仅保留整数的四舍五入)的.
        ;       $str =  StringRegExpReplace(StringLeft($num, StringInStr($num, '.'))& StringTrimRight(StringFormat("%0" & $dight + 1 & "s", StringMid($num, $dot + 1, $dight + 1) + 5), 1), '\.$', '')
        ConsoleWrite($num & @TAB & '(' & $dight & ')=====>' & @TAB & $str & @CR)
EndFunc   ;==>_round
发表于 2015-3-16 12:11:10 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 12:14 编辑

回复 58# annybaby

我不知道该怎么说了
你就试试
Round(9.155, 2)
Round(9.156, 2)
Round(2.155, 2)
Round(8.155, 2)

按常识说,都应该是.16吧,你试试看
发表于 2015-3-16 12:30:00 | 显示全部楼层
本帖最后由 netegg 于 2015-3-16 12:31 编辑

刚想明白你要问什么,把consolewrite那行改成return $str呀,我那个是测试要看的,根本没返回值
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 17:40 , Processed in 0.071025 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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