以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于四舍五入  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=170886)

--  作者:wangglby
--  发布时间:2021/8/10 15:21:00
--  关于四舍五入

有一个单元格数据为6.995,用setformat保留2位 显示为7.00,又把这个单元格用round2保留2位,数值变为6.99了,不应该为7.00吗?

 

 


--  作者:有点蓝
--  发布时间:2021/8/10 15:33:00
--  
setformat只是影响显示的效果,不会更改后台的数据
--  作者:wangglby
--  发布时间:2021/8/10 22:07:00
--  
这可能是个BUG,我又专门测试了下

表A和B,有编码和价格两个列


表B的 datacolchanged 代码 如下,在表A和表B,录入一行一样的编码,在表B价格列输入6.995,表A的价格列值为6.99,四舍五不入。



Dim Filter As String = "[编码] = \'" & e.DataRow("编码") & "\'"
    Dim drs As List(Of DataRow) = DataTables("表A").Select(Filter)
    For Each dr As DataRow In drs
        dr("价格") = round2( e.DataRow("价格"),2)
Next


[此贴子已经被作者于2021/8/10 22:16:30编辑过]

--  作者:有点蓝
--  发布时间:2021/8/10 22:25:00
--  
不是bug,这种属于四舍六入五成双:https://www.baidu.com/baidu?ie=UTF-8&word=%E5%9B%9B%E8%88%8D%E5%85%AD%E5%85%A5%E4%BA%94%E6%88%90%E5%8F%8C


--  作者:wangglby
--  发布时间:2021/8/10 23:01:00
--  
这一块完全不懂

s=iif(val(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Chars(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Length+w))>4,

这行代码报错,放到内部函数时,提示应为表达式

--  作者:有点蓝
--  发布时间:2021/8/10 23:12:00
--  
这是一行代码,不要换行,应该是发帖的时候没有处理好

s=iif(val(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Chars(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Length+w))>4,Cstr(val(left(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0"),Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Length+w) & left(l,-w))+val(l.Insert(100+w,"1"))),left(Cstr(Math.Floor(val(s))).PadLeft(1-w,"0"),Cstr(Math.Floor(val(s))).PadLeft(1-w,"0").Length+w) & left(l,-w))

--  作者:wangglby
--  发布时间:2021/8/11 8:00:00
--  

关于 round2

 

我又用以下代码测试,结果又不一样了

 

Dim a As Double

a= round2(6.995,2)

messagebox.show(a)

 

 

这个代码结果 =7,上个我发的代码结果是6.99


--  作者:有点蓝
--  发布时间:2021/8/11 8:45:00
--  
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。