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

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

 火... [复制链接]
发表于 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
发表于 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
发表于 2015-3-14 13:52:35 | 显示全部楼层
和前面说的可能没太多关系,不过不清楚为什么

测试2.155/8.155也一样
netegg 发表于 2015-3-14 03:58



    可能是BUG了,至少属于在实际应用中的BUG,看看能不能抽空写个函数
发表于 2015-3-14 13:54:42 | 显示全部楼层
回复 19# afan


    A大看看我17楼的函数可以不
发表于 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



    没用的,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
发表于 2015-3-14 14:23:10 | 显示全部楼层
回复 21# afan
这样不对?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-3-14 14:57:28 | 显示全部楼层
本帖最后由 afan 于 2015-3-14 15:02 编辑

回复 22# chzj589


    仔细看看我的代码~
虽然你尾部添加一位改变了测试的初值,StringFormat() 是对的,但用 Round() 同样是对的;如我那样,去掉添加的那一位(用LZ提供的可以重现错误的数值),StringFormat() 是错的,而且用 Round() 同样是错的。
发表于 2015-3-14 15:04:34 | 显示全部楼层
回复 20# zldfsz


    我测试代码中得到的值是对的,不知道是否通用
发表于 2015-3-14 16:53:09 | 显示全部楼层
回复  afan


    A大看看我17楼的函数可以不
zldfsz 发表于 2015-3-14 13:54



    和内置函数 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
发表于 2015-3-14 22:04:28 | 显示全部楼层

评分

参与人数 1金钱 -20 收起 理由
afan -20 警告,禁止纯表情!

查看全部评分

发表于 2015-3-14 22:23:02 | 显示全部楼层
问题是小数点后的第3位必需大于5
9.156 就可以=9.16
9.155 就不行= 9.15
发表于 2015-3-15 00:12:56 | 显示全部楼层
回复 16# zldfsz

明显不对,前面的图没看到吗,就算是.155也是两种结果
发表于 2015-3-15 08:19:29 | 显示全部楼层
问题是小数点后的第3位必需大于5
9.156 就可以=9.16
9.155 就不行= 9.15
由此看来不是"四舍五入",而是"五舍六入"。
加个判断,逢五加一,这样是否可以?
发表于 2015-3-15 09:24:37 | 显示全部楼层
回复 24# afan

恩,还是A大严谨,我只考虑到两个参数都是正数的情况,用负数和零带进去就不对了,看来还要做判断,有时间再弄弄

回复 27# netegg
我那个区分的啊,你测试下就知道了
发表于 2015-3-15 09:32:33 | 显示全部楼层
本帖最后由 netegg 于 2015-3-15 09:40 编辑

回复 29# zldfsz
我知道,不过你那个可能有点隐患,对于固定位数的可以,如果四位小数的四舍五入就要换规则,我不知道前面的规则是否可以用变量,如果不行的话,局限性太大
就像afan说的,stringformat最后的定义还是用的round
这是stringformat %f的说明
意义 :精度值指定小数点后的位数。如果显示小数点,且至少有一个数字在它之前出现。值将四舍五入到适当的位数。
默认值 :默认精度为 6 ;如果精度为 0,或句点 (.) 后面没有数字,不输出小数点。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 17:27 , Processed in 0.169326 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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