Reputation: 603
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
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
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