Int的分数部分

时间:2014-02-24 07:25:35

标签: delphi delphi-7

我想将数字的小数部分作为整数值返回。

我该怎么办?

例如我有12.98,我想在Integer变量中返回98。

4 个答案:

答案 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

的内容