实数精度问题:如何自定义DELPHI中的实数保留的小数位数(要四舍五入)(50分)

  • 主题发起人 dearwolf
  • 开始时间
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
我想让实数四舍五入保留两位,请问可以在定义变量类型时设定吗?

或是那位有更好的办法,请不吝赐教!!!!!
 
W

wenjk

Unregistered / Unconfirmed
GUEST, unregistred user!
不能在定义变量时,设定实数小数点位数。
可以自写一个函数处理。
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

 
H

hongxing_dl

Unregistered / Unconfirmed
GUEST, unregistred user!
用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;
 
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
是四舍五入的吗?
 
H

hongxing_dl

Unregistered / Unconfirmed
GUEST, unregistred user!
还有一个方法:
var
s:real;
begin
s:=12.345;
s:=round(s*100)/100;
end;
当然都是四舍五入的啦
 
A

aafly

Unregistered / Unconfirmed
GUEST, unregistred user!
var
i: real;
s: string;
begin
str(i:0:2,s)

i:= strtofloat(s);
保留两位
end;
 
C

chnplzh

Unregistered / Unconfirmed
GUEST, unregistred user!
去看以下帖子吧,我前后300块大洋:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1699158
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1698144
 

逻辑鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
to aafly:
有一处写反了
str(i:0:2,s)

i:= strtofloat(s);
改成
i:= strtofloat(s);
str(i:0:2,s)


另外 有一个缺点 不能四舍五入
 
W

wlmmlw

Unregistered / Unconfirmed
GUEST, unregistred user!
老大,设置
SysUtils.CurrencyDecimals := 2;
或是用format()
 
D

defcjjava

Unregistered / Unconfirmed
GUEST, unregistred user!
最简单的办法是用FromatFloat,它会自动四舍五入。
 
F

fxh7622

Unregistered / Unconfirmed
GUEST, unregistred user!
用这个函数
FormatCurr();

 

江南大米

Unregistered / Unconfirmed
GUEST, unregistred user!
大家写了那么多种,我来写个format的用法吧!
format('%.2f',[you real])
保留两位小数
 
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
TO: wlmmlw
用 SysUtils.CurrencyDecimals := 2
设置后Currency 是不是就变成了自动四舍
五入保留两位小数了?

 
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾:
小弟是想要一种不会自己增加数值的实数类型
如:
var temp:float;
temp:=StrToFloat('123.45');
此时temp的值不是123.450000000000,而是123.45**********//*为任何数
我要求的数据精度很高,所以我不想要123.45**********这种形式,
现在我已经解决了,不过是用变通的办法,我想知道Delphi中的实数类型可以
自定义精度吗?
wlmmlw大哥你的方法可以实现吗?
请尽快回答
小弟要结帖散分了。
 
C

cfhi

Unregistered / Unconfirmed
GUEST, unregistred user!
var temp:float;
temp:=StrToFloatf('123.45678',FFfixed,6,2);

结果为123.46
 
Y

yanghai0437

Unregistered / Unconfirmed
GUEST, unregistred user!
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
 
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
看来不会有什么收获了
结贴散分!!
 
S

SS2000

Unregistered / Unconfirmed
GUEST, unregistred user!
你这个问题其实是一个概念问题。
要想用实数做到两位精度(正好两位)是不可能的,这涉及到实数(小数)在计算机内的
实现原理,根据这个原理,永远不可能对所有小数都有恰好两位小数的表达方式。
但并不是没有办法实现,只是要换一种方法,换一种思维。
精度和数值的范围是一个矛盾,就像用天平可以精确到0.01克,但是绝不可能称1吨的东西,地磅可以称几十吨的大卡车,但是绝不可能精确到克。

1:如果要求精度不是很高,数值范围不到(1亿以内),可以用double或者Extended来实现。
2:可以用Delphi的Currency类型,4位小数,范围是-922337203685477.5808..922337203685477.5807,这个4为小数和实数的4位是不一样的,这个4位就是4位,没有误差。
3:最后一种终极办法(Currency类型也是用这种原理)定点小数。这是解决你这种问题的最通用的办法,并且没有任何误差。
 
D

dearwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何定点小数???
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
uses
Math;

SimpleRoundto函数Delphi自带的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部