货币类型精确到角,有以下例子
RoundTo(1.14,-1)=1.1
RoundTo(1.15,-1)=1.1
RoundTo(1.150000001)=1.2
刚开始不知存储精确度的问题,汇总以下发现误差近十元,没办法我改成
RoundTo(x+0.00000001,-1)有没有更好的解决办法,1.5在计算机中是以1.49999xxx9的方式存储的吗
RoundTo(1.14,-1)=1.1
RoundTo(1.15,-1)=1.1
RoundTo(1.150000001)=1.2
刚开始不知存储精确度的问题,汇总以下发现误差近十元,没办法我改成
RoundTo(x+0.00000001,-1)有没有更好的解决办法,1.5在计算机中是以1.49999xxx9的方式存储的吗
解决方案 »
- idhttp 访问 jsp页面中cookie不生成问题
- datetime转成long
- 请问用indyftp 如何判断在服务器上的文件是否存在?
- 紧急求助!!!做过数据导出到WORD的朋友都来看看,下午要交工啊
- Delphi调用LINUX API程序(高分求救,在线等待)
- InstallShield 打包如何出现unistall?
- *****在给一个olevariant参数赋一个variant值时报错'variant does not reference an automation object!'***** ---why---
- 在delphi+sql sever7中如何获取服务器名?
- 情人节快到了,各位大侠打算怎么过呀?
- 怎样建立与程序进程同步的进度条?
- 请教高手,分布式传送数据的问题?
- 打开位图
formatFloat('0.00',x);还不行的话自己写一个函数判断好了。
RoundTo()函数采用的是Banker' rounding,可以说是一种取舍规则
例如:
5.5 rounds to 6
6.5 rounds to 6
要正确的按四舍五入得到6可以将X+0.5
如果你要精确到两位小数,可以这么写:
RoundTo((100 * X + 0.5)/100,-2);当然formatfloat()没测试过,应该也可以。
S: String;
begin
Str(123456.7890:0:2, S);
这些“伴水”以前提到的,应该有帮助,试试...
begin
if rightstr(floattostr(v/100),1)='5' then
result:=round((v/1000)*10+0.1)/10
else
result:=round((v/1000)*10)/10;
end;
round指最近的整数,和银行家舍入法的要求差不多,所以采用了银行家舍入
这种舍入法可以保证映射的一致性,也说是round(a)=round(a)
同时保证数值的平均分布。
银行家舍入法的原理是这样的:
对于<0.5和>0.5的数都没有异议了
那么对于0.5而言,就需要变成0或1
考虑到0.5的发生原理是1 /2
所以在round之后,应当对同样的操作引入更少的误差
所以取到偶数,这样的话,在round(round(a / 2) /2 )时,平均误差最小