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,或句点 (.) 后面没有数字,不输出小数点。
页: 1 [2] 3 4 5 6 7
查看完整版本: [以解决+远超预期]"四舍五入"无法搞定?