2013-06-15 2 views
0

Я пытаюсь вычислить PI с некоторыми алгоритмами, но главное - отобразить его с точностью 30. Я попытался вывести строку с format и т. Д. Но кажется, что максимум точность double - 15. Есть ли какой-нибудь класс или какой-то метод, который поможет мне в этом?Java: отображение поплавка с точностью 30

Я уже пробовал:

public class Challenge6PI { 

    public static void main(String[] args){ 

     System.out.format("%.30f", 
       Math.log(Math.pow(640320, 3) + 744)/Math.sqrt(163)); 
    } 
} 
+0

Гм, что вы делаете с вашим 'DecimalFormat'? – fge

+0

@fge Извините, что осталось, что я пытался раньше. – ashur

+0

Вы можете попробовать альтернативную библиотеку, см. Мой ответ – fge

ответ

1

Я полагаю, что Float не поддерживает такую ​​точность. Вы можете использовать BigDecimal для этого.

3

В то время как у JDK есть BigDecimal, к сожалению у вас нет .sqrt().

Что означает, что ваш лучший выбор заключается в использовании apfloat:

final Apfloat f1 = new Apfloat(640320); 
final Apfloat f2 = ApfloatMath.pow(f1, 3L); 
final Apfloat f3 = f2.add(new Apfloat(744)); 
final Apfloat f4 = ApfloatMath.sqrt(new Apfloat(163), 1000L); 
final Apfloat ret = ApfloatMath.log(f3.divide(f4)); 

System.out.println(ApfloatMath.round(ret, 30L, RoundingMode.HALF_DOWN)); 

У вас есть более короткий путь для пи, хотя;)

System.out.println(ApfloatMath.pi(30L)); 
+0

Спасибо, я попробую с 'apfloat', но я также попробовал с' BigDecimal', который дал мне теоретически почти точный номер PI с точностью 30. Но некоторые цифры не эквивалентны, когда я сравнивал его с http: //3.141592653589793238462643383279502884197169399375105820974944592 .com/index3141.html, у меня есть «3.141592652589793238462643383529', что странно, потому что большинство чисел верны, а некоторые в середине отличаются. – ashur

0

дважды не так много точности. Посмотрите, как double type is implemented. Для произвольной точности посмотреть на BigDecimal

Например:

BigDecimal bd = new BigDecimal(22.0/7.0); 
df.setMaximumFractionDigits(30); 
System.out.println(df.format(bd)); 
+2

НЕ создавайте 'BigDecimal' из двухместных! Вы потеряете точность перед тем, как будете _build_ it – fge

+0

Хорошая точка fge, спасибо. К счастью, 22.0/7.0 является плохим приближением pi. – squib

Смежные вопросы