使用Ada属性提取浮点数的小数部分

时间:2015-08-17 07:39:32

标签: floating-point attributes ada

例如:

X:float:= 12.34;

如何获得' 34'没有使用循环?

1 个答案:

答案 0 :(得分:0)

以下函数显示了获取它的一种方法。它首先减去数字的整数部分。这个积分部分实际上可以向上向上而不是向下,因此,如果减法产生的数字小于零,则需要通过添加一个来调整。

function FloatBit (X1: float) return float is
    X2: float;
begin
    X2 := X1 - Float(Integer(X1));
    if (X2 < 0.0) then X2 := X2 + 1.0; end if;
    return X2;
end FloatBit;

返回您可以查看的浮点部分:

Put_Line(Float'Image(FloatBit(12.34)));

如果你想将它转换为一个整数(比如两位小数),你可以简单地将它乘以一百然后再取整数部分,如:

function FloatBitAsInt (X1: float; mult: integer) return integer is
begin
    return Integer(FloatBit(X1) * Float(mult));
end FloatBitAsInt;

并查看:

Put_Line(Integer'Image(FloatBitAsInt(12.34, 100)));

对于任意小数位数,我不确定你是否可以在没有循环的情况下执行此操作,因为我不想要Ada,因为aspseudo-code回到我的快速访问存储中: - )

while float(integer(x)) is different from x:
    multiply x by ten

但请记住,浮点不是一种精确的存储方法。大多数数字足够接近但不准确。因此,这种方法最终可能会将0.1之类的数字转换为100000001490116119384765625,我非常怀疑这是你想要的。