Floating point 利用Ada属性提取浮点数的小数部分

Floating point 利用Ada属性提取浮点数的小数部分,floating-point,attributes,ada,Floating Point,Attributes,Ada,例如: X:浮点数:=12.34 如何在不使用循环的情况下获取“34”?以下函数显示了获取它的一种方法。它首先减去数字的整数部分。这个整数部分实际上可能会向上取整,而不是向下取整,因此,如果减法的结果是一个小于零的数字,则需要通过加一来调整 function FloatBit (X1: float) return float is X2: float; begin X2 := X1 - Float(Integer(X1)); if (X2 < 0.0) then X

例如:

X:浮点数:=12.34


如何在不使用循环的情况下获取“34”?

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

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;
如果你想把它转换成一个整数,比如说两个小数,你只需将它乘以100,然后再取整数部分,比如:

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)));
对于任意数量的小数,我不确定您是否可以在没有循环的情况下使用aspseudo代码,因为我不希望Ada移回我的快速访问存储:-

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

但请记住,浮点并不是一种精确的存储方法。大多数数字都很接近,但并不准确。因此,这种方法很可能最终将0.1这样的数字转换成1000000149011919384765625,我非常怀疑这是您想要的。

它不起作用。这里返回0.34,而不是34。@Yony,然后用它乘以100。我会更新答案。这只适用于“.”后面有2位数字的浮点,现在适用于任何浮点。你必须设置一个限制,因为浮点不准确。实际上,0.10可能存储为类似于0.10000402之类的内容。我不确定你会想要10000402在这种情况下。我会想要数字的精确表示,即使它有点像0.100004,只要不涉及循环。你的问题不是很好定义。一旦X被分配到12.34,没有人能看到它是实际分配到12.34还是12.34000。请让您的要求更精确。您希望1.04版能看到什么?1.004? 1.0004?从表面上看,我已经回答了这个问题的大部分。请注意,12.34不能完全存储在浮点数中;因此,几乎不可能让程序执行您想要的操作。如果您需要解释,请访问。如果您想更准确地存储像12.34这样的数字,这是处理货币金额时应该做的,请使用十进制定点。
while float(integer(x)) is different from x:
    multiply x by ten