#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是十进制数字和基数,第二个数字是我应该得到的,第三个数字是我得到的。)
答案 0 :(得分:1)
您使用fNum
的固定数字而不是余下的数字。请注意,在每种情况下,小数部分都相当于12
。
由于十进制数通常不能完全用二进制浮点表示,因此您需要确定您感兴趣的十进制数,并进行一些舍入。
答案 1 :(得分: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...