我想将数字的小数部分作为整数值返回。
我该怎么办?
例如我有12.98,我想在Integer变量中返回98。
答案 0 :(得分:3)
试试这个
function FractionToInt(const Precision:Integer; const Amount: Double): Integer;
begin
Result := Trunc(Frac(Amount) * Power(10, Precision));
end;
答案 1 :(得分:2)
标准函数Frac
返回数字的小数部分。
此函数将值作为浮点值返回。您希望使用十进制表示将小数部分作为整数。但那是不可能的。或者至少不会做你期望的事情。
例如,您对0.1的期望是什么?事实证明,0.1不能完全用二进制浮点表示:http://pages.cs.wisc.edu/~rkennedy/exact-float?number=0.1
作为另一个例子,在双精度中,您的值12.98实际上表示为
12.98000 00000 00000 42632 56414 56060 11152 26745 60546 875
我确信这不是你所期待的。所以你要求的意思,如果按面值解释,不会像你期望的那样表现。我认为你需要花一点时间来解决这个可表示性问题。必读:What Every Computer Scientist Should Know About Floating-Point Arithmetic。
如果要使用带小数表示的小数值,则需要使用小数而不是二进制数据类型。在Delphi中,通常意味着使用Currency
数据类型,这是一种定点十进制数据类型。
答案 2 :(得分:2)
你可以这样做:
const
DECIMALS = 2;
var
I: Real;
Inte: Integer;
begin
I := 12.98;
Inte := StrToInt(Copy(FloatToStr(Frac(I)*100),1,DECIMALS));
ShowMessage(IntToStr(Inte));
end;
您需要定义小数常量。不是最好的解决方案,但我希望能帮到你。
答案 3 :(得分:2)
这将最多可以处理10个小数位
您需要在uses子句中包含数学
function GetFractionValueAsInteger( Value : Double ) : Integer;
var fFracValue : Double;
iFracLength : integer;
begin
result := 0;
fFracValue := Frac( value );
if fFracValue > 0 then
fFracValue := SimpleRoundTo( fFracValue + 0.00000000001, -10)
else if fFracValue < 0 then
fFracValue := SimpleRoundTo( fFracValue - 0.00000000001, -10);
if fFracValue = 0 then
exit;
if fFracValue < 0 then
iFracLength := Length(Floattostr( fFracValue ))-3
else
iFracLength := Length(Floattostr( fFracValue ))-2;
if iFracLength <= 0 then
exit;
result := Round( fFracValue * Power( 10, iFracLength));
end;
使用此
的示例ShowMessage( inttostr( GetFractionValueAsInteger( 12.98 ) ) ); //=98
ShowMessage( inttostr( GetFractionValueAsInteger( 12.9 ) ) ); //=9
ShowMessage( inttostr( GetFractionValueAsInteger( 12.000 ) ) ); //=0
ShowMessage( inttostr( GetFractionValueAsInteger( - 10.333 ) ) ); //=-333
ShowMessage( inttostr( GetFractionValueAsInteger( 33.33 ) ) ); //=33
ShowMessage( inttostr( GetFractionValueAsInteger( 33.000333 ) ) ); //=333
ShowMessage( inttostr( GetFractionValueAsInteger( 33.1023456789 ) ) ); //=1023456789
我已经包含了SimpleRoundTo,因为有时获得3.33的Frac值可以返回类似于0.332999999999998
的内容