1
#include <iostream>
#include <stdio.h>
#include <string>
#include <iomanip>
#include <cmath>

using namespace std;
void toBase (int n, int base)
{
    string x = "0123456789ABCDEF";
    if (n > 0)
    {
      toBase(n / base, base);
        cout << x[n % base];
    }
}

int main()
{

    float num;
    int a;
    cout << "";
    cin >> num;
    cout << "";
    cin >> a;
    toBase(num, a);
    cout << ".";
    float fNum = 12.34;
    int iPart = (int)fNum;
    float fPart = fNum - (float)iPart;
    toBase(fNum, a);
    cout << endl;


    }

我之前发布了一个类似的问题,我又来了。我只是无法让小数部分起作用。我尝试乘以 2,但它没有用,我不太擅长这个,所以我希望能得到一些帮助。无论如何,我应该创建一个将十进制数(带小数部分)转换为其他基数(从 2 到 16)的代码 - 到目前为止,10 个测试结果中只有 2 个是正确的。

10.5 - 1010.1 - 1010.1100   
2      
3.827 - 10.2110222122 - 10.110   
3     
82.7593 - 101.6744681322 - 101.13    
9     
7218.8192 - 5472.90139A8535 - 5472.11    
11     
8273.8 - 26B8.C - 26B8.C    
15     
23517.75 - 5BDD.C - 5BDD.C
16    
92.33271 - 1011100.0101010100 - 1011100.1100
2     
4095.839 - 7777.6554426416 - 7777.14    
8     
29672.9311 - 13033220.3232113021 - 13033220.30    
4     
9999.987 - 270F.FCAC083126 - 270F.C    
16

如您所见,点之前的数字总是正确的,但小数部分(除了两种情况)总是错误的。(10.5 和 2 是十进制数和底数,第二个数字是我应该得到的,第三个数字是我得到的)。

4

2 回答 2

1

您需要分别处理整数部分和小数部分。粗略地说,您必须将两个部分的小数点移开,或者将数字移向小数点。因此,对于整数部分,您除以base将较高的有效数字移向小数点,而对于小数部分,您必须乘以base将较低的有效数字移向小数点。大致,

while (not_enough_digits) {
    fractional_part *= base;
    int digit = (int)fractional_part;
    fractional_part -= digit;
    std::cout << x[digit];
}

当然,除非base是 2 的幂,否则可能会出现舍入错误,因此只有这么多位是正确的,并且对于奇数基数,小数部分永远不会为零(除非由于舍入),因此循环条件不能是fractional_part != 0

例如,以 3 为底的 3.827,小数部分

3*0.827 = 2.481 ~> digit 2
3*0.481 = 1.443 ~> digit 1
3*0.443 = 1.329 ~> digit 1
3*0.329 = 0.987 ~> digit 0
3*0.987 = 2.961 ~> digit 2
3*0.961 = 2.883 ~> digit 2
...

10.211022...
于 2013-04-30T16:31:35.787 回答
1

您使用的是固定数字fNum而不是获得余数。请注意,在每种情况下,小数部分都相当于12.

由于十进制数字通常不能以二进制浮点数精确表示,因此您需要确定您感兴趣的十进制数字数量并进行一些舍入。

于 2013-04-30T16:28:38.393 回答