以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  不明白的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=41585)

--  作者:powermannico
--  发布时间:2013/10/23 3:04:00
--  不明白的问题
 
图片点击可在新窗口打开查看此主题相关图片如下:无标题2.jpg
图片点击可在新窗口打开查看
如图,有个临时表。表达式列[金额] = [工时费] * [折扣] = 23.75
可是用代码去引用数据,不管是Tables("临时表").Compute("Sum(金额)")

For Each theRow In Tables("临时表")
     theRow("金额")
Next

用messagebox调试时得到的都是23.74999...

--  作者:yinyb36
--  发布时间:2013/10/23 6:49:00
--  
金额列设置的是4位小数,因此显示的是23.7500,而真实值为 23.7499997019768,如果要一样,请修改表达式
--  作者:狐狸爸爸
--  发布时间:2013/10/23 8:13:00
--  

这样修改:

http://www.foxtable.com/help/topics/0108.htm

 


--  作者:powermannico
--  发布时间:2013/10/23 8:39:00
--  
如果25*0.95=23.74999那我能理解,因为表达式列设置了4位小数,所以显示23.7500,问题是25*0.95就正好等于23.75啊,怎么四舍五入也不会出来个23.74999呀
--  作者:Bin
--  发布时间:2013/10/23 8:42:00
--  
双精度小数就是会有这样的小误差的,不用纠结它哦.
--  作者:狐狸爸爸
--  发布时间:2013/10/23 8:43:00
--  

对于计算机来说,1有的时候并不等于1的:

 

http://www.foxtable.com/help/topics/1829.htm

 

 

另外,记得涉及计算的列,列类型尽量不要用单进度小数,请用双精度小数,单进度出现的计算误差更大。

[此贴子已经被作者于2013-10-23 8:44:27编辑过]

--  作者:Bin
--  发布时间:2013/10/23 8:46:00
--  
以下是引用狐狸爸爸在2013-10-23 8:43:00的发言:

对于计算机来说,1有的时候并不等于1的:

 

http://www.foxtable.com/help/topics/1829.htm

 

 

另外,记得涉及计算的列,列类型尽量不要用单进度小数,请用双精度小数。


双精度一样误差的啊,帮助文件里举例的都是双精度小数呢图片点击可在新窗口打开查看
--  作者:狐狸爸爸
--  发布时间:2013/10/23 8:56:00
--  

呵呵,按理,双精度不会出现一楼这么大的误差的,楼主可能至少一列是单精度

 

图片点击可在新窗口打开查看

[此贴子已经被作者于2013-10-23 9:16:49编辑过]

--  作者:powermannico
--  发布时间:2013/10/23 9:03:00
--  
  好的感谢楼上各位。金额是双精度,参与计算的其他两列是单精度。那我列类型就不改了,在引用数据的代码前加Round2吧。如果不想四舍五入,比如不管是1.25还是1.22,我只想取1.2(用代码如何做)
[此贴子已经被作者于2013-10-23 9:04:27编辑过]

--  作者:狐狸爸爸
--  发布时间:2013/10/23 9:17:00
--  
Dim c As Double = 1.25
output.show(math.Floor(c * 10) /10)