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

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

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

[au3]Func _round(ByRef $num, $bits)
        If IsInt($num) Then Return SetError(0,1,$num)
        Local $aA = StringSplit($num, '.', 2)
        If not (StringLen($aA[1]) > $bits) Then Return SetError(0,2,$num)
        Return $aA[0]&'.'& StringLeft(Number(StringLeft($aA[1], $bits+1)) + 5, $bits)
endfunc       
       
[/au3]
发表于 2015-3-15 10:32:00 | 显示全部楼层
回复 24# afan
惭愧,这个roundx居然没看明白怎么回事
发表于 2015-3-15 10:53:36 | 显示全部楼层
本帖最后由 afan 于 2015-3-15 10:55 编辑
回复  afan
惭愧,这个roundx居然没看明白怎么回事
netegg 发表于 2015-3-15 10:32



    那个是 zldfsz 写的,我也没看懂,只是加入了测试好看结果而已……
我写的比较长,昨天写了下,还没抽空写完
发表于 2015-3-15 10:57:24 | 显示全部楼层
回复 33# afan
试试31楼的有什么局限性没有,我没仔细试
发表于 2015-3-15 11:09:36 | 显示全部楼层
本帖最后由 afan 于 2015-3-15 11:16 编辑
回复  afan
试试31楼的有什么局限性没有,我没仔细试
netegg 发表于 2015-3-15 10:57



    试了,局限不小… 以下随便找了些,你可以试试和你的比较:
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)
发表于 2015-3-15 12:47:50 | 显示全部楼层
回复 35# afan
知道怎么回事了
发表于 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
发表于 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[1])
         If $aLen <=$bits Then
                 $n=$num
         Else
                 $n= $num & "1"
         EndIf
  EndIf
Return Round($n,$bits)
EndFunc

评分

参与人数 1威望 +1 金钱 +30 贡献 +3 收起 理由
afan + 1 + 30 + 3 很棒的见解

查看全部评分

发表于 2015-3-15 13:20:59 | 显示全部楼层
[au3]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[/au3]
好像有一个是错的
发表于 2015-3-15 14:06:06 | 显示全部楼层
找到症结所在了,号称是什么银行家算法,就是这么定义round的
发表于 2015-3-15 14:58:57 | 显示全部楼层
好像有一个是错的
netegg 发表于 2015-3-15 13:20



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

测试值                                内置 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
发表于 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



    这方法简单有效,只需要加上一个判断大数(或科学计数法)就OK了
发表于 2015-3-15 16:13:26 | 显示全部楼层
回复 42# afan
知道31楼什么地方错了
发表于 2015-3-15 16:27:44 | 显示全部楼层
本帖最后由 netegg 于 2015-3-15 16:50 编辑

回复 42# afan

试试这个
[au3]Func a($num, $digital)
ConsoleWrite(StringLeft($num, StringInStr($num, '.'))  & stringtrimright(stringmid($num, Stringinstr($num, '.') + 1, $digital + 1) + 5, 1)& @cr)
endfunc[/au3]
还差一步,.0的时候,没有0只有.
发表于 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)
.............................................
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 17:13 , Processed in 0.075547 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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