给定分数十进制数n和整数k,请将十进制数n转换为等效的二进制数,精度至小数点后的k精度。
例子:
Input: n = 2.47, k = 5
Output: 10.01111
Input: n = 6.986 k = 8
Output: 110.11111100
我们强烈建议您单击此处并进行实践,然后再继续解决方案。
A)将小数的整数部分转换为等效的二进制数
- 用十进制数除以2并将余数存储在数组中。
- 将商除以2。
- 重复步骤2,直到得到的商等于零。
- 等效的二进制数将与步骤1的所有余数相反。
B)将小数的小数部分转换为等效的二进制数
- 将小数十进制数乘以2。
- 结果十进制数的整数部分将是分数二进制数的第一位。
- 仅使用十进制数字的小数部分重复步骤1,然后再执行步骤2。
C)结合二进制数的整数部分和小数部分。
插图
Let's take an example for n = 4.47 k = 3
Step 1: Conversion of 4 to binary
1. 4/2 : Remainder = 0 : Quotient = 2
2. 2/2 : Remainder = 0 : Quotient = 1
3. 1/2 : Remainder = 1 : Quotient = 0
So equivalent binary of integral part of decimal is 100.
Step 2: Conversion of .47 to binary
1. 0.47 * 2 = 0.94, Integral part: 0
2. 0.94 * 2 = 1.88, Integral part: 1
3. 0.88 * 2 = 1.76, Integral part: 1
So equivalent binary of fractional part of decimal is .011
Step 3: Combined the result of step 1 and 2.
Final answer can be written as:
100 + .011 = 100.011
演示上述步骤的程序:
C++
// C++ program to convert fractional decimal
// to binary number
#include
using namespace std;
// Function to convert decimal to binary upto
// k-precision after decimal point
string decimalToBinary(double num, int k_prec)
{
string binary = "";
// Fetch the integral part of decimal number
int Integral = num;
// Fetch the fractional part decimal number
double fractional = num - Integral;
// Conversion of integral part to
// binary equivalent
while (Integral)
{
int rem = Integral % 2;
// Append 0 in binary
binary.push_back(rem +'0');
Integral /= 2;
}
// Reverse string to get original binary
// equivalent
reverse(binary.begin(),binary.end());
// Append point before conversion of
// fractional part
binary.push_back('.');
// Conversion of fractional part to
// binary equivalent
while (k_prec--)
{
// Find next bit in fraction
fractional *= 2;
int fract_bit = fractional;
if (fract_bit == 1)
{
fractional -= fract_bit;
binary.push_back(1 + '0');
}
else
binary.push_back(0 + '0');
}
return binary;
}
// Driver code
int main()
{
double n = 4.47;
int k = 3;
cout << decimalToBinary(n, k) << "\n";
n = 6.986 , k = 5;
cout << decimalToBinary(n, k);
return 0;
}
Java
// Java program to convert fractional decimal
// to binary number
import java.util.*;
class GFG
{
// Function to convert decimal to binary upto
// k-precision after decimal point
static String decimalToBinary(double num, int k_prec)
{
String binary = "";
// Fetch the integral part of decimal number
int Integral = (int) num;
// Fetch the fractional part decimal number
double fractional = num - Integral;
// Conversion of integral part to
// binary equivalent
while (Integral > 0)
{
int rem = Integral % 2;
// Append 0 in binary
binary += ((char)(rem + '0'));
Integral /= 2;
}
// Reverse string to get original binary
// equivalent
binary = reverse(binary);
// Append point before conversion of
// fractional part
binary += ('.');
// Conversion of fractional part to
// binary equivalent
while (k_prec-- > 0)
{
// Find next bit in fraction
fractional *= 2;
int fract_bit = (int) fractional;
if (fract_bit == 1)
{
fractional -= fract_bit;
binary += (char)(1 + '0');
}
else
{
binary += (char)(0 + '0');
}
}
return binary;
}
static String reverse(String input)
{
char[] temparray = input.toCharArray();
int left, right = 0;
right = temparray.length - 1;
for (left = 0; left < right; left++, right--)
{
// Swap values of left and right
char temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return String.valueOf(temparray);
}
// Driver code
public static void main(String[] args)
{
double n = 4.47;
int k = 3;
System.out.println(decimalToBinary(n, k));
n = 6.986;
k = 5;
System.out.println(decimalToBinary(n, k));
}
}
// This code contributed by Rajput-Ji
Python3
# Python3 program to convert fractional
# decimal to binary number
# Function to convert decimal to binary
# upto k-precision after decimal point
def decimalToBinary(num, k_prec) :
binary = ""
# Fetch the integral part of
# decimal number
Integral = int(num)
# Fetch the fractional part
# decimal number
fractional = num - Integral
# Conversion of integral part to
# binary equivalent
while (Integral) :
rem = Integral % 2
# Append 0 in binary
binary += str(rem);
Integral //= 2
# Reverse string to get original
# binary equivalent
binary = binary[ : : -1]
# Append point before conversion
# of fractional part
binary += '.'
# Conversion of fractional part
# to binary equivalent
while (k_prec) :
# Find next bit in fraction
fractional *= 2
fract_bit = int(fractional)
if (fract_bit == 1) :
fractional -= fract_bit
binary += '1'
else :
binary += '0'
k_prec -= 1
return binary
# Driver code
if __name__ == "__main__" :
n = 4.47
k = 3
print(decimalToBinary(n, k))
n = 6.986
k = 5
print(decimalToBinary(n, k))
# This code is contributed by Ryuga
C#
// C# program to convert fractional decimal
// to binary number
using System;
class GFG
{
// Function to convert decimal to binary upto
// k-precision after decimal point
static String decimalToBinary(double num, int k_prec)
{
String binary = "";
// Fetch the integral part of decimal number
int Integral = (int) num;
// Fetch the fractional part decimal number
double fractional = num - Integral;
// Conversion of integral part to
// binary equivalent
while (Integral > 0)
{
int rem = Integral % 2;
// Append 0 in binary
binary += ((char)(rem + '0'));
Integral /= 2;
}
// Reverse string to get original binary
// equivalent
binary = reverse(binary);
// Append point before conversion of
// fractional part
binary += ('.');
// Conversion of fractional part to
// binary equivalent
while (k_prec-- > 0)
{
// Find next bit in fraction
fractional *= 2;
int fract_bit = (int) fractional;
if (fract_bit == 1)
{
fractional -= fract_bit;
binary += (char)(1 + '0');
}
else
{
binary += (char)(0 + '0');
}
}
return binary;
}
static String reverse(String input)
{
char[] temparray = input.ToCharArray();
int left, right = 0;
right = temparray.Length - 1;
for (left = 0; left < right; left++, right--)
{
// Swap values of left and right
char temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return String.Join("",temparray);
}
// Driver code
public static void Main(String[] args)
{
double n = 4.47;
int k = 3;
Console.WriteLine(decimalToBinary(n, k));
n = 6.986;
k = 5;
Console.WriteLine(decimalToBinary(n, k));
}
}
// This code has been contributed by 29AjayKumar
PHP
输出:
100.011
110.11111
时间复杂度: O(len(n))
辅助空间: O(len(n))
其中len()是数字n中包含的总位数。
将二进制分数转换为十进制
参考:
http://cs.furman.edu/digitaldomain/more/ch6/dec_frac_to_bin.htm
http://www.cquestions.com/2011/07/c-program-for-fractional-decimal-to.html