当前位置: 代码迷 >> Sql Server >> 关于收支
  详细解决方案

关于收支

热度:80   发布时间:2016-04-24 19:30:13.0
求助关于收支
本帖最后由 yyr513 于 2013-12-21 19:39:25 编辑
假设
7月出售了价格1250元的产品 税收是1.05
所以价格为 1250*1.05=1312.5 四舍五入 为1313
收入1313元

8月出售了价格2250元的产品 税收是1.05
所以价格为 2250*1.05=2362.5 四舍五入 为2363
收入2363元

9月出售了价格2250元的产品 税收是1.05
所以价格为 2250*1.05=2362.5 四舍五入 为2363
收入2363元

而当我要查询的时候10月以前的收支平衡的时候
要等于 税后出售的金额的总和-收入的金额总和
即 税后出售的金额的总和 为 1312.5+2362.5+2632.5 =6037.5 四舍五入 6038
收入的金额总和为1313+2363+2363 =6039
这时 收支出现了-1的误差
这样算起来
就会出现 单个月查询时,收支平衡。但是多个月查询的时候就会出现误差。

求助怎样解决这个问题

------解决方案--------------------
仔细看了,因为:

税后出售的金额的总和 为 1312.5+2362.5+2632.5 =6037.5 那么这个是准确的数,这个时候四舍五入,就是6038,也就是相当于加上了0.5。

而上面:
所以价格为 1250*1.05=1312.5 四舍五入 为1313

所以价格为 2250*1.05=2362.5 四舍五入 为2363

所以价格为 2250*1.05=2362.5 四舍五入 为2363

那么就多了1.5了,上面是多了0.5,所以正好是相差1
------解决方案--------------------
在计算税后出售金额总和时,应先四舍五入后再求和. 而不是先求和在四舍五入.

create table yyr
(月份 int,出售产品价格 int,税收 decimal(6,2),税后出售金额 decimal(8,2),收入 int)

insert into yyr(月份,出售产品价格,税收)
 select 7,1250,1.05 union all
 select 8,2250,1.05 union all
 select 9,2250,1.05

-- 计算[税后出售金额],[收入].
update yyr
 set 税后出售金额=出售产品价格*税收,
     收入=round(出售产品价格*税收,0)

select * from yyr

/*
月份          出售产品价格  税收      税后出售金额       收入
----------- ----------- -------- ---------------- -----------
7           1250         1.05      1312.50         1313
8           2250         1.05      2362.50         2363
9           2250         1.05      2362.50         2363

(3 row(s) affected)
*/


-- 计算收支平衡
create proc sp_szph
(@beginmonth int, -- 起始月份
 @endmonth int    -- 结束月份
)   
as
begin
 set nocount on
 
 select '收支误差: '+rtrim(sum(round(税后出售金额,0))-sum(收入)) 'result' --> 先四舍五入后再求和
  from yyr
  where 月份 between @beginmonth and @endmonth
end


-- 测试1 计算7月份收支平衡
exec sp_szph 7,7
/*
result
---------------------------------------------------
收支误差: 0.00
*/


-- 测试2 计算7-9月份收支平衡
exec sp_szph 7,9
/*
result
---------------------------------------------------
收支误差: 0.00
*/


-- 测试3 计算8-9月份收支平衡
exec sp_szph 8,9
/*
result
---------------------------------------------------
收支误差: 0.00
*/

------解决方案--------------------
先四舍五入,然后再进行加和~~!
------解决方案--------------------
如果币别是美元的话误差会更大了,建议计算时最好保留6位小数以上,计算完了显示时保留2位或4位小数
曾想起第一家公司的会计为了一毛钱的误差查帐查了一个通宵,原因就是四舍五入造成的
  相关解决方案