作者RuinGgg (Tank)
标题Re: [VBA ] 取小数点第三位问题
时间Wed Sep 26 10:22:02 2018
※ 引述《changyg (Bob)》之铭言:
: ※ 引述《RuinGgg (Tank)》之铭言:
: : 主要是Data1 和Data2要去做简单比较,
: : Data1里面是Excel资料,有小数点,
: : 我是直接以Round(XX,3)来写,
: : EX: 6.3333333 -> 6.333
: 直接在 Excel 使用 =round(储存格,3) 就是常见的四舍五入。
: : Data2的资料是由VBA小程式跑出来的,
: : 其中我用worksheetfunction.round(XX,3)来写,但是6.3333333会变成6.334
: : 另外试了worksheetfunction.rounddown,
: : 结果变成6.332....
: 我猜这边描述有误,因为直接使用 WorksheetFunction.Round(,3)
: 或是 WorksheetFunction.RoundDown(,3)
: 甚至 WorksheetFunction.RoundUp(,3)
: 相当於直接在 Excel 的储存格输入 =Round(), =RoundDown, =RoundUp()
: 不会出现你说的进位问题,都是单纯的四舍五入、无条件舍去或进位。
: 你的提问应该是,
: 在 VBA 之下的 Round() 计算跟 使用 WorksheetFunction.Round() 为什麽有不同?
: 官方文件指出在 VBA 底下的 Round() 使用
: 奇进偶舍,又称为四舍六入五成双规则、银行进位法(Banker's Rounding)
: ※维基百科 => (https://bit.ly/2DoAT6Q)
: ※Microsoft Docs => (https://bit.ly/2DqpnrN)
: 简单来说,遇到 4 就舍去,遇到 6 就进位,
: 唯独遇到 5 比较麻烦。
: 1. 5 後面有数值? 有 => 进位。
: 2. 5 後面没有数值,
: 此时 5 前面的数字是偶数 => 舍去;5 前面是奇数 => 进位。
: 例如:
: Round(1.252,1)= 1.3 取小数第一位,5 後面有数值
: Round(1.25,1) = 1.2 取小数第一位,5 後面无数值且前面是 2 偶数
: Round(1.35,1) = 1.4 取小数第一位,5 後面无数值且前面是 3 奇数
: 因自己处理过计算数值的问题,藉此机会回答你的问题。:P
: (使用版本为 2007 Excel)
1. 感谢c大指正...
直接以数字"6.33333"去试Excel里的Round和VBA里的worksheetfunction.round,
确实结果是一样的。
2. 简单贴一下我的原始码
For i = 3 To 99
For j = 1 To Cells(i - 1, 5)
Dbot = Cells(k - 1, 6) - Cells(i - 1, 2) / Cells(i - 1, 5)
Cells(k, 6) = WorksheetFunction.Round(Dbot, 3)
If k = 7 Then
End If
k = k + 1
Next j
Next i
这边发现Dbot算出来的数字是6.3336667, 所以round出来本来就是6.334....
所以是我计算数值没搞清楚的问题....
改了一下计算方式就可以对应了@@
算到头晕了...
谢谢!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.132.124.146
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Visual_Basic/M.1537928524.A.B99.html