2014-02-18 9 views
0

У меня возникают проблемы с плавающими точками. А двойник. 56 в Java, например, могут быть фактически сохранены как .56000 ... 1.Ошибки с плавающей запятой

Я пытаюсь преобразовать десятичную дробь. Я пытался сделать это с помощью дробей

Continuous Fractions

но мои ответы с помощью этого метода были неточны из-за того, как компьютер хранится и закругленные знаков после запятой.

Я попробовал альтернативный метод:

public static Rational rationalize(double a){ 
     if(a>= 1){ 
     //throw some exception 
    } 
    String copOut = Double.toString(a); 

    int counter = 0; 
    System.out.println(a); 
    while(a%1 != 0 && counter < copOut.length() - 2){ 
     a *= 10; 
     counter++; 
    } 
    long deno = (long)Math.pow(10,counter);//sets the denominator 
    Rational frac = new Rational((long)a,deno)//the unsimplified rational number 
    long gcd = frac.gcd(); 
    long fnum = frac.getNumer();//gets the numerator 
    long fden = frac.getDenom();//gets the denominator 
    frac = new Rational(fnum/gcd, fden/gcd); 
    return frac;  
} 

Я использую строку, чтобы найти длину десятичной, чтобы определить, сколько времени я должен умножить на 10. Я позже усечение десятичной. Это дает мне правильный ответ, но это не похоже на правильный подход? Может кто-нибудь предложить «правильный» способ сделать это?

+0

Первая проблема здесь заключается в том, что * input * является «double». Таким образом, вы уже теряете точность до того, как какой-либо из ваших кодов даже выполняет. Подумайте о 'BigDecimal.' – EJP

ответ

1

На самом деле вы отлично себя чувствуете .. Но это не сработает, если в Вводе есть что-то около 11.56. Здесь вам нужно сделать copOut.length() - 3.

Чтобы сделать это динамическое использование String#split()

String decLength = copOut.split("\\.")[1]; //this will result "56" (Actual string after decimal) 

Теперь вам просто нужно сделать только

while(a%1 != 0 && counter < decLength.length()){ 
     a *= 10; 
     counter++; 
    } 

Если вы хотите, чтобы удалить петлю затем использовать

long d = (long)Math.pow(10,decLength.length()); 
a=a*d; 
Смежные вопросы