浮点数本来就有保存精度的问题,所以计算的实际精度要小于电脑的实际精度才行。
给你篇以前的老文章看:
问题: 实数精度问题:如何自定义DELPHI中的实数保留的小数位数(要四舍五入) ( 积分: 50 )
分类: Object Pascal
来自: dearwolf, 时间: 2003-11-12 13:07:00, ID: 2288827
我想让实数四舍五入保留两位,请问可以在定义变量类型时设定吗?
或是那位有更好的办法,请不吝赐教!!!!!
来自: wenjk, 时间: 2003-11-12 13:24:00, ID: 2288874
不能在定义变量时,设定实数小数点位数。
可以自写一个函数处理。
Function Floats(F:real):real ;
begin
Result :=StrTOFloat(Format('%.2f',[f]));
end;
procedure TForm1.Button1Click(Sender: TObject);
var ss:real; s:string ;
begin
ss :=1232.234234;
ss:=Floats(ss);
Edit1.Text :=FloatTOstr(ss);
end;
end.
--------------------------------
结果是: 1232.23
来自: hongxing_dl, 时间: 2003-11-12 13:25:00, ID: 2288879
用SQL可以:select round(12.345,2) from table where 1<>1
或者用
var
i,s:real;
begin
i:=12.345;
s:=strtofloat(formatfloat('0.00',i));
//s就是保留后的实数
end;
来自: dearwolf, 时间: 2003-11-12 13:29:00, ID: 2288894
是四舍五入的吗?
来自: hongxing_dl, 时间: 2003-11-13 13:40:00, ID: 2291609
还有一个方法:
var
s:real;
begin
s:=12.345;
s:=round(s*100)/100;
end;
当然都是四舍五入的啦
来自: aafly, 时间: 2003-11-14 8:05:00, ID: 2293162
var
i: real;
s: string;
begin
str(i:0:2,s);
i:= strtofloat(s);
保留两位
end;
来自: chnplzh, 时间: 2003-11-14 8:21:00, ID: 2293195
去看以下帖子吧,我前后300块大洋:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1699158
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1698144
来自: 逻辑鱼, 时间: 2003-11-14 8:34:00, ID: 2293214
to aafly:
有一处写反了
str(i:0:2,s);
i:= strtofloat(s);
改成
i:= strtofloat(s);
str(i:0:2,s);
另外 有一个缺点 不能四舍五入
来自: wlmmlw, 时间: 2003-11-14 8:40:00, ID: 2293229
老大,设置
SysUtils.CurrencyDecimals := 2;
或是用format()
来自: defcjjava, 时间: 2003-11-14 8:47:00, ID: 2293241
最简单的办法是用FromatFloat,它会自动四舍五入。
来自: fxh7622, 时间: 2003-11-14 8:49:00, ID: 2293253
用这个函数
FormatCurr();
来自: 江南大米, 时间: 2003-11-14 8:56:00, ID: 2293274
大家写了那么多种,我来写个format的用法吧!
format('%.2f',[you real])
保留两位小数
来自: dearwolf, 时间: 2003-11-14 13:21:00, ID: 2294240
TO: wlmmlw
用 SysUtils.CurrencyDecimals := 2; 设置后Currency 是不是就变成了自动四舍
五入保留两位小数了?
来自: dearwolf, 时间: 2003-11-14 13:47:00, ID: 2294312
各位大虾:
小弟是想要一种不会自己增加数值的实数类型
如:
var temp:float;
temp:=StrToFloat('123.45');
此时temp的值不是123.450000000000,而是123.45**********//*为任何数
我要求的数据精度很高,所以我不想要123.45**********这种形式,
现在我已经解决了,不过是用变通的办法,我想知道Delphi中的实数类型可以
自定义精度吗?
wlmmlw大哥你的方法可以实现吗?
请尽快回答
小弟要结帖散分了。
来自: cfhi, 时间: 2003-11-14 13:57:00, ID: 2294332
var temp:float;
temp:=StrToFloatf('123.45678',FFfixed,6,2);
结果为123.46
来自: yanghai0437, 时间: 2003-11-14 14:19:00, ID: 2294407
var
temp:Real;
begin
temp:=12.455345452453453452;
temp:=RoundTo(Temp,-2);
Edit1.Text := FloatToStr(Temp);//12.46
Unit
Math
Category
Arithmetic routines
type TRoundToRange = -37..37;
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
Description
Call RoundTo to round AValue to a specified power of ten.
AValue is the value to round.
ADigit indicates the power of ten to which you want AValue rounded. It can be any value from ?
37 to 37 (inclusive).
The following examples illustrate the use of RoundTo:
Expression Value
RoundTo(1234567, 3) 1234000
RoundTo(1.234, -2) 1.23
RoundTo(1.235, -2) 1.24
RoundTo(1.245, -2) 1.24
Note: The behavior of RoundTo can be affected by the Set8087CW procedure or SetRoundMode function
来自: dearwolf, 时间: 2003-11-19 13:15:00, ID: 2302407
看来不会有什么收获了
结贴散分!!
来自: SS2000, 时间: 2003-11-19 20:57:00, ID: 2303608
你这个问题其实是一个概念问题。
要想用实数做到两位精度(正好两位)是不可能的,这涉及到实数(小数)在计算机内的
实现原理,根据这个原理,永远不可能对所有小数都有恰好两位小数的表达方式。
但并不是没有办法实现,只是要换一种方法,换一种思维。
精度和数值的范围是一个矛盾,就像用天平可以精确到0.01克,但是绝不可能称1吨的东西,地磅可以称几十吨的大卡车,但是绝不可能精确到克。
1:如果要求精度不是很高,数值范围不到(1亿以内),可以用double或者Extended来实现。
2:可以用Delphi的Currency类型,4位小数,范围是-922337203685477.5808..922337203685477.5807,这个4为小数和实数的4位是不一样的,这个4位就是4位,没有误差。
3:最后一种终极办法(Currency类型也是用这种原理)定点小数。这是解决你这种问题的最通用的办法,并且没有任何误差。
来自: dearwolf, 时间: 2003-11-26 13:05:00, ID: 2318147
请问如何定点小数???
来自: wr960204, 时间: 2003-11-26 13:28:00, ID: 2318201
uses
Math;
SimpleRoundto函数Delphi自带的
来自: dearwolf, 时间: 2003-11-28 11:34:00, ID: 2321636
小弟谢谢各位大虾了
就此结贴散分了。
来自: dearwolf, 时间: 2003-11-28 11:34:00, ID: 2321638
小弟谢谢各位大虾了
就此结贴散分了。
来自: dearwolf, 时间: 2003-12-04 12:58:00, ID: 2333300
多人接受答案了。
得分大富翁: aafly-10,hongxing_dl-10,SS2000-10,wlmmlw-10,wr960204-10,