netegg 发表于 2015-3-15 10:20:16

本帖最后由 netegg 于 2015-3-15 10:53 编辑

Func _round(ByRef $num, $bits)
        If IsInt($num) Then Return SetError(0,1,$num)
        Local $aA = StringSplit($num, '.', 2)
        If not (StringLen($aA) > $bits) Then Return SetError(0,2,$num)
        Return $aA&'.'& StringLeft(Number(StringLeft($aA, $bits+1)) + 5, $bits)
endfunc       
       

netegg 发表于 2015-3-15 10:32:00

回复 24# afan
惭愧,这个roundx居然没看明白怎么回事

afan 发表于 2015-3-15 10:53:36

本帖最后由 afan 于 2015-3-15 10:55 编辑

回复afan
惭愧,这个roundx居然没看明白怎么回事
netegg 发表于 2015-3-15 10:32 http://www.autoitx.com/images/common/back.gif


    那个是 zldfsz 写的,我也没看懂,只是加入了测试好看结果而已……
我写的比较长,昨天写了下,还没抽空写完

netegg 发表于 2015-3-15 10:57:24

回复 33# afan
试试31楼的有什么局限性没有,我没仔细试

afan 发表于 2015-3-15 11:09:36

本帖最后由 afan 于 2015-3-15 11:16 编辑

回复afan
试试31楼的有什么局限性没有,我没仔细试
netegg 发表于 2015-3-15 10:57 http://www.autoitx.com/images/common/back.gif


    试了,局限不小… 以下随便找了些,你可以试试和你的比较:Round(5233836.46, 3)
Round(7062075.9772, 0)
Round(7081.4, 3)
Round(89.563086478, 0)
Round(8.0033249, 2)
Round(925.9, 0)
Round(26895186.8, 2)
Round(7551.6, 3)
Round(3558.90006613, 0)
Round(833930.308, 3)
Round(5643.78, 3)
Round(57.61, 3)
Round(92924631.4, 2)
Round(315.6, 0)
Round(86.8, 3)
Round(698.0705, 3)

netegg 发表于 2015-3-15 12:47:50

回复 35# afan
知道怎么回事了

netegg 发表于 2015-3-15 12:55:37

#include<stdio.h>
#include<math.h>

int main(void)
{
    int width;
    double a = 158.385427;

    puts("Enter the width");
    scanf("%d",&width);

    if(a>0.0)
         a = (int)(a*pow(10,width) + 0.5)/pow(10,width);
    else
         a = (int)(a*pow(10,width) - 0.5)/pow(10,width);

    printf("The result is %.*lf\n",width,a);

    return 0;
}妈的,没现成的apii

h20040606 发表于 2015-3-15 13:00:27

本帖最后由 h20040606 于 2015-3-15 13:34 编辑

Func _round($num,$bits)
Local $aA=StringSplit($num, '.', 2)
If @error Then
   $n= $num
Else
       Local $aLen=StringLen($aA)
       If $aLen <=$bits Then
               $n=$num
       Else
               $n= $num & "1"
       EndIf
EndIf
Return Round($n,$bits)
EndFunc

netegg 发表于 2015-3-15 13:20:59

Func _round($num, $digital)
Return Mod(Ceiling($num * 10^ $digital ), Floor($num*10^ $digital))?Ceiling($num*10^ $digital)/10^ $digital:Floor($num*10^ $digital)/10^ $digital
endfunc
好像有一个是错的

netegg 发表于 2015-3-15 14:06:06

找到症结所在了,号称是什么银行家算法,就是这么定义round的

afan 发表于 2015-3-15 14:58:57

好像有一个是错的
netegg 发表于 2015-3-15 13:20 http://www.autoitx.com/images/common/back.gif


    错到离谱… 内置的对的,你那错的

测试值                                内置 Round        自定义 _Round
99664916.1723(2) ==>                 99664916.17         99664916.18
22167.662659362(2) ==>         22167.66         22167.67
80008.0944370186(3) ==>         80008.094         80008.095
13446071.1412964(1) ==>         13446071.1         13446071.2
66299.703023(2) ==>                 66299.7         66299.71
48793.232120848(3) ==>         48793.232         48793.233
6658.342(0) ==>                 6658                 6659
611.8302451431(3) ==>         611.83                 611.831
1809.749(1) ==>                 1809.7                 1809.8
74.516494(3) ==>                 74.516                 74.517
93521004.371(2) ==>                 93521004.37         93521004.38
7.022(1) ==>                         7                 7.1
9239844.3941(2) ==>                 9239844.39         9239844.4
8.1191(0) ==>                 8                 9
315249.47112457(0) ==>         315249                 315250
20161.94779(1) ==>                 20161.9         20162
34024315.942693(1) ==>         34024315.9         34024316
61247.25514(3) ==>                 61247.255         61247.256
7.21332948(3) ==>                 7.213                 7.214
517822.741364284(2) ==>         517822.74         517822.75

afan 发表于 2015-3-15 15:31:01

Func _round($num,$bits)
Local $aA=StringSplit($num, '.', 2)
If @error Then
   $n= $num
   ...
h20040606 发表于 2015-3-15 13:00 http://www.autoitx.com/images/common/back.gif


    这方法简单有效,只需要加上一个判断大数(或科学计数法)就OK了

netegg 发表于 2015-3-15 16:13:26

回复 42# afan
知道31楼什么地方错了

netegg 发表于 2015-3-15 16:27:44

本帖最后由 netegg 于 2015-3-15 16:50 编辑

回复 42# afan

试试这个
Func a($num, $digital)
ConsoleWrite(StringLeft($num, StringInStr($num, '.'))& stringtrimright(stringmid($num, Stringinstr($num, '.') + 1, $digital + 1) + 5, 1)& @cr)
endfunc
还差一步,.0的时候,没有0只有.

afan 发表于 2015-3-15 16:46:16

回复 44# netegg


    离谱极了
a(9.154, 2)
a(9.155, 2)
a(9.156, 2)
a(2.155, 2)
a(8.155, 2)
.............................................
页: 1 2 [3] 4 5 6 7
查看完整版本: [以解决+远超预期]"四舍五入"无法搞定?