netegg
发表于 2015-3-15 16:52:23
本帖最后由 netegg 于 2015-3-15 16:54 编辑
回复 45# afan
没问题呀
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
netegg
发表于 2015-3-15 17:22:39
本帖最后由 netegg 于 2015-3-15 17:23 编辑
ConsoleWrite(StringRegExpReplace(StringLeft($num, StringInStr($num, '.')) & stringtrimright(stringmid($num, Stringinstr($num, '.') + 1, $digital + 1) + 5, 1), '\.$', '')& @cr)如果是0的话还是有些毛病.比如: a(80008.0944370186,3)
afan
发表于 2015-3-15 17:43:23
回复 46# netegg
改了当然这几个没问题…
netegg
发表于 2015-3-16 06:47:27
本帖最后由 netegg 于 2015-3-16 06:59 编辑
回复 48# afan
暂时ok了
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
现在能想到的问题还有一个,就是9.99保留1位,四舍五入是进还是不进,如果是进位的话可能还是个麻烦事
netegg
发表于 2015-3-16 09:47:24
本帖最后由 netegg 于 2015-3-16 11:12 编辑
应该是搞定了
_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
afan再测试下
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)
...
哥不玩了
netegg
发表于 2015-3-16 11:14:10
回复 51# afan
netegg
发表于 2015-3-16 11:29:29
还不错,两天搞定(加上修机器)
afan
发表于 2015-3-16 11:30:32
回复 52# netegg
netegg
发表于 2015-3-16 11:39:18
本帖最后由 netegg 于 2015-3-19 20:47 编辑
负数的四舍五入,没考虑,科学记数法没有四舍五入一说,(就算是有那么也是前面的数字值的四舍五入,更何况科学计数法,本身就规定了,整数位必须是1`9, 小数位随便),完全不是数值计算,后面的e+015可以不要,这个根据实际情况拆一下就行了,还有就是最后那个-3,是什么意思,这个和四舍五入也没关系了,是格式化了,对了,整数是没有四舍五入的
annybaby
发表于 2015-3-16 11:47:59
MsgBox(0,Round(9.855,2),8.03 - 7.98)
netegg
发表于 2015-3-16 11:49:09
本帖最后由 netegg 于 2015-3-16 11:54 编辑
回复 56# annybaby
捣什么乱,前面都讨论过了
round函数最大的问题在于,保留位数的后一位如果是5,所要保留位数的最后一位是偶数则进一,是奇数则不进,(或者反过来)
annybaby
发表于 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
netegg
发表于 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吧,你试试看
netegg
发表于 2015-3-16 12:30:00
本帖最后由 netegg 于 2015-3-16 12:31 编辑
刚想明白你要问什么,把consolewrite那行改成return $str呀,我那个是测试要看的,根本没返回值