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呀,我那个是测试要看的,根本没返回值
页: 1 2 3 [4] 5 6 7
查看完整版本: [以解决+远超预期]"四舍五入"无法搞定?