У меня возникают проблемы с плавающими точками. А двойник. 56 в Java, например, могут быть фактически сохранены как .56000 ... 1.Ошибки с плавающей запятой
Я пытаюсь преобразовать десятичную дробь. Я пытался сделать это с помощью дробей
но мои ответы с помощью этого метода были неточны из-за того, как компьютер хранится и закругленные знаков после запятой.
Я попробовал альтернативный метод:
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. Я позже усечение десятичной. Это дает мне правильный ответ, но это не похоже на правильный подход? Может кто-нибудь предложить «правильный» способ сделать это?
Первая проблема здесь заключается в том, что * input * является «double». Таким образом, вы уже теряете точность до того, как какой-либо из ваших кодов даже выполняет. Подумайте о 'BigDecimal.' – EJP