Java Denary to Binary Converter Прецизионные советы
Я все еще изучаю Java, и я делаю упражнение на этом конвертере. Я написал что-то следующее, это работает. Проблема майнера заключается в том, что когда он преобразует небольшую десятичную дробь, у него будет обычная проблема точности (я так понимаю, поэтому я делаю так, чтобы он выводил дробь, которую он фактически использовал для расчета). Я обнаружил, что большинство онлайн-конвертеров или конвертеров приложений решают эту проблему одним из следующих способов:
- ограничить десятичное пространство от ввода пользователя и его вывода
- вывести неточный результат как есть
Я хочу знать, как люди думают об этой проблеме, когда используют конвертер с немного точной проблемой.. это имеет значение вообще? И есть ли способ исправить эту проблему на самом деле? Пожалуйста, поделитесь своими мыслями. Спасибо ^^
private static void DtoB() {
int power;
long i, integer;
double d, fraction, f;
System.out.println();
System.out.print("Plese enter the denary number: ");
//Break the number
d = getDouble(); //method that gets the valid input form user
integer = Math.abs((long)d);
fraction = Math.abs(d - integer);
i = integer; //store the original input for later use
f = fraction; //store the original input for later use
power = 1;
System.out.println("Integer part: "+i);
System.out.println("Fraction part: "+f);
System.out.println();
System.out.print("The binary form is: ");
//Convert the integer part
//get the largest power of 2 smaller than the number
while(integer != 0) {
while(power <= integer/2) {
power *= 2;
}
System.out.print("1");
integer -= power;
//get the rest 1 & 0 till the smallest power of 2
while(power > 1) {
power /= 2;
if (integer < power)
System.out.print("0");
else {
System.out.print("1");
integer -= power;
}
}
}
//Convert the fraction part
if (fraction < 1.0){ //check if there is a fraction part needs to convert
System.out.print(".");
while (fraction < 1.0 && fraction != 0) {
fraction *= 2;
if (fraction > 1.0) {
System.out.print("1");
fraction = (fraction - 1);
}
else {
System.out.print("0");
}
}
}
else if (fraction == 0) {
}
System.out.println();
}
1 ответ
У вас есть требование, так что вам решать, что приемлемо. Если бы вы писали это для клиента, конечно, вы бы спросили его.
Чтобы избежать проблем с точностью с плавающей точкой, вообще избегайте типов с плавающей точкой.
BigDecimal
класс существует для выполнения математики произвольной точности в Java.
Если по причинам учебы вы не хотите использовать BigDecimal
Тогда вы могли бы написать подобную функциональность самостоятельно. Читайте в своем номере в виде строки. Разделите это на .
чтобы получить целую часть и дробную часть, и преобразовать их в целые числа.
Вам также необходимо отслеживать ведущие нули в дробной части - в противном случае 3.51
а также 3.00051
оценил бы одно и то же. Так, например:
3.51
разбирает наi==3, f==51, z==0
42.0022
разбирает наi=42, f==22, z==2
Преобразование в двоичный файл я оставляю вам в качестве упражнения.