procedure TForm1.Button1Click(Sender: TObject);
var tBase:double; //Extended;
begin
tbase:=4925.775; //这里是每个人工资所得税基数,几年来就上个月给财务审核出这个数计算有错
edit2.Text:=formatFloat('0.00',4925.775); // =4925.78
edit3.Text:=formatFloat('0.00',tBase); // =4925.77
//后面导致扣税算成了 430.15 (实际应该是430.16)
end;
在工资系统税率计算中发现以上问题,并不是每个浮点数都有这样的计算问题(随便找了几个数也只发现这个4925.775有问题). 把变量声明改成: var tBase:Extended; 后,计算结果都为4925.78,这样虽然可以了,但我担心这样又会造成其他某些未知的浮点数计算时也会造成上述的问题.请对这方面有研究的兄弟谈谈该怎样处理?
var tBase:double; //Extended;
begin
tbase:=4925.775; //这里是每个人工资所得税基数,几年来就上个月给财务审核出这个数计算有错
edit2.Text:=formatFloat('0.00',4925.775); // =4925.78
edit3.Text:=formatFloat('0.00',tBase); // =4925.77
//后面导致扣税算成了 430.15 (实际应该是430.16)
end;
在工资系统税率计算中发现以上问题,并不是每个浮点数都有这样的计算问题(随便找了几个数也只发现这个4925.775有问题). 把变量声明改成: var tBase:Extended; 后,计算结果都为4925.78,这样虽然可以了,但我担心这样又会造成其他某些未知的浮点数计算时也会造成上述的问题.请对这方面有研究的兄弟谈谈该怎样处理?
解决方案 »
- delphi access violation
- schtasks在cmd窗口中输入正常,但使用delphi的shellexecute命令不行,怎么处理?
- 如何获取image1中jpg的颜色
- delphi 新手,问个新手问题,怎么样把record类型连接成一个 list啊??
- 如何绕过135端口访问服务器上的COM+?
- 请问如果用DBcombobox中自动读取数据库某字段
- 我开发的《赵玲Delphi函数库》V1.5来看看吧,编程能用得上
- 希望各位高手来讨论一下一个4000人在线的考试系统的设计方案!!做过大型考试系统的高手进来!!
- Delphi在Win2000下开发的问题
- 哪位大哥知道哪儿有 好看的图标。 数据库类, 增加.删除.修改等
- 我用winexec带SW_HIDE参数启动的程序如何获取他的窗口句柄?
- delphi 读取注册表问题
用到浮点类型时,要注意到对于任何非二进位分式的数值,浮点数都无法精确表示。如 0.5是 1/2 ,0.3125是5/16,都可以精确保存,而 0.2 是 1/5,0.3是3/10都只能是近似值,所以建议用Currency。
但是lz用double存储4925.775这个值,肯定不至于损失精度。可能和FormatFloat的实现方式有关,FormatFloat的实现是用汇编的,看不懂,不好说。可以试试用RoundTo再用FloatToStr替代FormatFloat试试。另外如果确定小数点位数不会超出4位,建议用Currency。他是定点存储的。不会丢失精度。Extended只不多把浮点数存储的位数加大为10个字节。但是仍有可能丢失精度的。