C++如何设置浮点的小数部分

C++ How do I set the fractional part of a float?

本文关键字:小数部 设置 何设置 C++      更新时间:2023-10-16

我知道如何获取浮点的小数部分,但不知道如何设置。我有两个函数返回的整数,一个保存整数,另一个保存小数部分。例如:

int a = 12;
int b = 2; // This can never be 02, 03 etc
float c;

如何使c变为12.2?我知道我可以添加(float)b 10之类的东西,但如果b大于10呢?然后我必须除以100,依此类推。有没有函数或其他东西可以做setfractional(c, b)

感谢

edit:我越想这个问题,就越意识到它是多么不合逻辑。如果b==1,那么它是12.1,但如果b==10,它也是12.1,所以我不知道该如何处理。我猜函数永远不会返回分数为>=10的数字,但我不知道。

类似于:

float IntFrac(int integer, int frac)
{
    float integer2 = integer;
    float frac2 = frac;
    float log10 = log10f(frac2 + 1.0f);
    float ceil = ceilf(log10);
    float pow = powf(10.0f, -ceil);
    float res = abs(integer);
    res += frac2 * pow;
    if (integer < 0)
    {
        res = -res;
    }
    return res;
}

Ideone:http://ideone.com/iwG8UO

这就像是说:log10(98+1)=log10(99)=1..995,ceilf(1.995)=2,powf(10,-2)=0.01,99*0.01=0.99,然后12+0.99=12.99,然后我们检查符号

让我们希望IEEE 754浮动数学的变幻莫测不会受到太大的打击:-)

我要补充的是,使用double而不是float可能会更好。除了三维图形,很少有领域使用float是当今的一个好主意。

最简单的方法是计算b的数字,然后进行相应的除法:

int i = 10;
while(b > i) // rather slow, there are faster ways
    i*= 10;
c = a + static_cast<float>(b)/i;

请注意,由于float的性质,结果可能不是您所期望的。此外,如果您想要类似3.004的东西,您可以将i的初始值修改为10的另一个幂。

请在包含include-math.h和stdlib.h文件后尝试以下代码:

 int a=12;
 int b=22;
 int d=b;
 int i=0;
 float c;
while(d>0)
{
d/=10;
i++;
}
c=a+(float)b/pow(10,i);