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)
.............................................