Patrick Kelly
Patrick Kelly

Reputation: 603

Ada: Fraction part of Float/Fixed as Integer

In Ada, I would like to separate out a number like 12.345 out into two distinct integers:

whole : integer := 12;
fraction : integer := 345;

The Whole part is easy, but I don't know how to get the Fraction part.

My starting idea is:

12.345 mod Integer(12.345)

which will return 0.345, and could be multiplied by the inverse magnitude (in this case ×1000), but I don't know how to count the amount of digits either.

Upvotes: 0

Views: 1915

Answers (2)

Jānis Š.
Jānis Š.

Reputation: 552

In NWS suggestion, use
X_Int : constant Integer := Integer(Float'Truncation(X));
instead of
X_Int : constant Integer := Integer (X);

Otherwise, the whole part of the float may be rounded up (e.g. if X = 12.99, X_Int will be 13).

Upvotes: 1

user571138
user571138

Reputation:

Not a full Answer but this gets the fractional part as a string to enable further manipulation to retreive it as an integer:

with Ada.Text_Io;

procedure Remainder is 
   package Fio is new Ada.Text_IO.Float_IO(Float);

   X : constant Float := 12.345;
   X_Int : constant Integer := Integer (X);
   X_Rem : constant Float := Float'Remainder(X,Float (X_Int));

begin
   Fio.Put (X_Rem, Aft => 6, Exp => 0);

end Remainder;

Upvotes: 3

Related Questions