zldfsz
发表于 2015-3-14 12:48:21
只能变通一下了
Local $iRound1 = RoundX(2.154, 2)
Local $iRound2 = RoundX(2.155, 2)
Local $iRound3 = RoundX(8.154, 2)
Local $iRound4 = RoundX(8.155, 2)
MsgBox(4096, "", "The following values were rounded: " & @CRLF & '2.154==>'&$iRound1 & @CRLF &'2.155==>'&$iRound2 & @CRLF &'8.154==>'&$iRound3 & @CRLF &'8.155==>'&$iRound4)
Func roundx($number, $num_digits)
$number=Int($number*10^($num_digits+1))
If StringRight($number,1)<5 Then
$number=Int($number/10)/10^$num_digits
Else
$number=Int($number/10+1)/10^$num_digits
EndIf
Return $number
EndFunc
chzj589
发表于 2015-3-14 13:45:22
回复 1# duanqs
是这样吗?
Local $read1="9.1545"
Local $read2="9.1552"
Local $read3="9.1665"
MsgBox(0,0,StringFormat('%.2f', $read1));9.15
MsgBox(0,0,StringFormat('%.2f', $read2));9.16
MsgBox(0,0,StringFormat('%.2f', $read3));9.17
afan
发表于 2015-3-14 13:52:35
和前面说的可能没太多关系,不过不清楚为什么
测试2.155/8.155也一样
netegg 发表于 2015-3-14 03:58 http://www.autoitx.com/images/common/back.gif
可能是BUG了,至少属于在实际应用中的BUG,看看能不能抽空写个函数
zldfsz
发表于 2015-3-14 13:54:42
回复 19# afan
A大看看我17楼的函数可以不
afan
发表于 2015-3-14 13:55:10
回复duanqs
是这样吗?
Local $read1="9.1545"
Local $read2="9.1552"
Local $read3="9.1665"
Ms ...
chzj589 发表于 2015-3-14 13:45 http://www.autoitx.com/images/common/back.gif
没用的,StringFormat() 和 Round() 是一样的结果Local $read1="9.154"
Local $read2="9.155"
Local $read3="9.166"
MsgBox(0,Round($read1,2),StringFormat('%.2f', $read1));9.15
MsgBox(0,Round($read2,2),StringFormat('%.2f', $read2));9.15
MsgBox(0,Round($read3,2),StringFormat('%.2f', $read3));9.17
chzj589
发表于 2015-3-14 14:23:10
回复 21# afan
这样不对?
afan
发表于 2015-3-14 14:57:28
本帖最后由 afan 于 2015-3-14 15:02 编辑
回复 22# chzj589
仔细看看我的代码~
虽然你尾部添加一位改变了测试的初值,StringFormat() 是对的,但用 Round() 同样是对的;如我那样,去掉添加的那一位(用LZ提供的可以重现错误的数值),StringFormat() 是错的,而且用 Round() 同样是错的。
afan
发表于 2015-3-14 15:04:34
回复 20# zldfsz
我测试代码中得到的值是对的,不知道是否通用
afan
发表于 2015-3-14 16:53:09
回复afan
A大看看我17楼的函数可以不
zldfsz 发表于 2015-3-14 13:54 http://www.autoitx.com/images/common/back.gif
和内置函数 Round() 还是有很多不同的Local $stest = RoundX(2.154, 2)
$stest &= RoundX(3.155, 2)
$stest &= RoundX(8.155, 2)
$stest &= RoundX(-8.155, 2)
$stest &= RoundX(8.155, -1)
$stest &= RoundX(-8.155, -1)
$stest &= RoundX(9.155, 2)
$stest &= RoundX(-9.155, 2)
$stest &= RoundX(9.155, -1)
$stest &= RoundX(-9.155, -1)
$stest &= RoundX(123456.15532123456712345678, 13)
$stest &= RoundX(123456155321234567.12345678, 2)
MsgBox(4096, '', $stest)
Func roundx($number, $num_digits)
Local $__number = $number
$number = Int($number * 10 ^ ($num_digits + 1))
If StringRight($number, 1) < 5 Then
$number = Int($number / 10) / 10 ^ $num_digits
Else
$number = Int($number / 10 + 1) / 10 ^ $num_digits
EndIf
;Return $number
Return $__number & ' (' & $num_digits & ') ==> ' & Round($__number, $num_digits) & ' ' & $number & @CRLF
EndFunc ;==>roundx
zxhou1
发表于 2015-3-14 22:04:28
{:face (131):}
chzj589
发表于 2015-3-14 22:23:02
问题是小数点后的第3位必需大于5
9.156 就可以=9.16
9.155 就不行= 9.15
netegg
发表于 2015-3-15 00:12:56
回复 16# zldfsz
明显不对,前面的图没看到吗,就算是.155也是两种结果
chzj589
发表于 2015-3-15 08:19:29
问题是小数点后的第3位必需大于5
9.156 就可以=9.16
9.155 就不行= 9.15
由此看来不是"四舍五入",而是"五舍六入"。
加个判断,逢五加一,这样是否可以?
zldfsz
发表于 2015-3-15 09:24:37
回复 24# afan
恩,还是A大严谨,我只考虑到两个参数都是正数的情况,用负数和零带进去就不对了,看来还要做判断,有时间再弄弄
回复 27# netegg
我那个区分的啊,你测试下就知道了
netegg
发表于 2015-3-15 09:32:33
本帖最后由 netegg 于 2015-3-15 09:40 编辑
回复 29# zldfsz
我知道,不过你那个可能有点隐患,对于固定位数的可以,如果四位小数的四舍五入就要换规则,我不知道前面的规则是否可以用变量,如果不行的话,局限性太大
就像afan说的,stringformat最后的定义还是用的round
这是stringformat %f的说明
意义 :精度值指定小数点后的位数。如果显示小数点,且至少有一个数字在它之前出现。值将四舍五入到适当的位数。
默认值 :默认精度为 6 ;如果精度为 0,或句点 (.) 后面没有数字,不输出小数点。