上周用firebird2.1做了一个劳资数据库,用来存储单位劳资信息并计算个人所得税。
深知税务人员秉公执法,锱铢不舍,所以不敢马虎,计算完毕后与税务机关的excel模板生产的数据进行了逐一的比较,发现存在2%的人员中存在一分钱的误差,估计是四舍五入的问题,用速算法算了算,发现问题出在小数点后第三位,比如如果是10.155,excel计算的结果是10.16,而把这个数值作为浮点数导入decimal字段时候,他是直接截取小数点后两位的,而10.156则取的是10.16,也就是说五舍六入了。
于是修改程序,那就是在程序中使用floattostr函数将浮点数转化为字符后插入,可以解决这个问题,但又出来另一个问题,那就是如果10.1445在excel里面是取10.14的,但在程序导入到数据库中则是10.15。后来再次修改,使用formatfloat函数规范数值,将所得税值取小数点后两位导入,这样就可以解决了。