vb的一个计算问题

xiemeilin 2009-05-29 01:34:54
Public Function ChangeInteger(fCIData As Double, cPrecision As String) As String
'根据精度化整
Dim Hstep As Double, xys As Double
Hstep = val(cPrecision) * 0.1
If val(cPrecision) = 3 Then
Hstep = 0.2
End If
xys = fCIData / Hstep
If val(Abs(xys) - Fix(Abs(xys))) > 0.5 Then
xys = Fix(Abs(xys)) + 1
End If
If val(Abs(xys) - Fix(Abs(xys))) < 0.5 Then
xys = Fix(Abs(xys))
End If
If val(Abs(xys) - Fix(Abs(xys))) = 0.5 Then
If Fix(Abs(xys)) / 2 = Fix(Fix(Abs(xys)) / 2) Then
xys = Fix(Abs(xys))
Else
xys = Fix(Abs(xys)) + 1
End If
End If
If fCIData < 0 Then
xys = -xys
End If
If val(cPrecision) >= 1 And val(cPrecision) < 10 Then
ChangeInteger = Format$(Fix(xys * Hstep * 10) / 10, "0.0")
End If
If val(cPrecision) >= 0.1 And val(cPrecision) < 1 Then
ChangeInteger = Format$(Fix(xys * Hstep * 100) / 100, "0.00")
End If
If val(cPrecision) >= 0.01 And val(cPrecision) < 0.1 Then
ChangeInteger = Format$(Fix(xys * Hstep * 1000) / 1000, "0.000")
End If
If val(cPrecision) >= 0.001 And val(cPrecision) < 0.01 Then
ChangeInteger = Format$(Fix(xys * Hstep * 10000) / 10000, "0.0000")
End If
End Function
这是我的一个计算化整的一个函数,当我的入参是(0.0175,0.05)或者是(0.0275,0.05)得到的值应该是0.02或者是0.03,进过debug发现是val(Abs(xys) - Fix(Abs(xys)))这个判断出问题,虽然Abs(xys)=3.5, Fix(Abs(xys))=3 但得到的值是0.499999999999999而不是0.5.不知道有什么好办法可以改良让val(Abs(xys) - Fix(Abs(xys)))当类似入参那样的值得到的结果是0.5。不要用四舍五入的方法,这样可能会出现一些没有意料到得数据的问题被判大或判小了。
...全文
82 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuggzu 2009-05-29
  • 打赏
  • 举报
回复
vb自身得问题,用single或者currency类型
vbman2003 2009-05-29
  • 打赏
  • 举报
回复
很正常,通俗点说浮点数就是近似值,论坛上有过许多类似问题的讨论了,专业的解释你可以google一下...
xiemeilin 2009-05-29
  • 打赏
  • 举报
回复
觉得还是用currency比较合理些,因为入参的精度都是4位小数。我是不明白为何用double类型出来的值就是0.499999999999999而不是.5呢
clear_zero 2009-05-29
  • 打赏
  • 举报
回复
currency类型

或者用round函数
vbman2003 2009-05-29
  • 打赏
  • 举报
回复
如果你要4位精度,就改double为currency类型

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧