Java Denary to Binary Converter Прецизионные советы

Я все еще изучаю Java, и я делаю упражнение на этом конвертере. Я написал что-то следующее, это работает. Проблема майнера заключается в том, что когда он преобразует небольшую десятичную дробь, у него будет обычная проблема точности (я так понимаю, поэтому я делаю так, чтобы он выводил дробь, которую он фактически использовал для расчета). Я обнаружил, что большинство онлайн-конвертеров или конвертеров приложений решают эту проблему одним из следующих способов:

  1. ограничить десятичное пространство от ввода пользователя и его вывода
  2. вывести неточный результат как есть

Я хочу знать, как люди думают об этой проблеме, когда используют конвертер с немного точной проблемой.. это имеет значение вообще? И есть ли способ исправить эту проблему на самом деле? Пожалуйста, поделитесь своими мыслями. Спасибо ^^

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

Преобразование в двоичный файл я оставляю вам в качестве упражнения.

Другие вопросы по тегам