题目
给定一个十进制的正小数转换为二进制的正小数(小数点保留 10 位)
解答
我们在做十进制正整数转换为二进制正整数时,采用短除法来计算,同样的正小数的进制间转换也是相同方法,参考文章1 参考文章2
我们获取正小数的整数部分和小数部分,整数部分的转换同 transform_pos_int 处理,小数部分的转换同 transform_pos_decimal 处理
// 十进制转二进制
void transform_pos_int(int src) {
int mod;
int left = src;
vector<int> vec;
while (left > 0) {
mod = left % 2;
left = left / 2;
vec.insert(vec.begin(), mod);
}
for (auto x : vec) {
std::cout << x;
}
}
void transform_pos_decimal(double src) {
const int SIZE = 10;
vector<int> vec(0, SIZE);
int idx = 0;
while (SIZE > idx) {
src *= 2.0F;
vec.push_back(static_cast<int>(src));
src -= vec[idx];
idx++;
}
for (auto x : vec) {
std::cout << x;
}
}
int main()
{
double x;
while (true) {
// 0.0000009 < x < 1
std::cin >> x;
int a = static_cast<int>(x);
double b = x - a;
if (a > 0) {
transform_pos_int(a);
std::cout << ".";
}
if (b > 0) {
transform_pos_decimal(b);
std::cout << std::endl;
}
}
return 0;
}
运行结果
1.25
1.0100000000
2.25
10.0100000000