2015-10-15 2 views
0

Я использую приложение, которое использует мм и дюймы для рисования масштабированных рисунков. Мне нужно конвертировать из одного в другое без потери точности. Я борюсь с точностью и обратился к пакету Apfloat. Может кто-то объяснить ... если я начну с 100 мм, конвертируем его в дюймы, а затем снова вернемся к Mm, почему я получаю потерю точности ???Понимание Apfloat и его точность

public static void main(String[] args) { 

    Apint mm = new Apint(100); 
    System.out.println("mm = " + mm); 

    // 25.4mm in 1 inch 
    Apfloat toInches = new Apfloat("25.4"); 

    // 100mm/25.4 = x-Inches  
    Apfloat inches = mm.divide(toInches); 
    System.out.println("mm - > Inch = " + inches); 

    // x-Inches x 25.4 = 100mm 
    Apfloat backToMm = inches.multiply(toInches); 
    System.out.println("Inch - > mm = " + backToMm); 
} 

Выходы:

mm = 100 
mm - > Inch = 3.93 
Inch - > mm = 9.99e1 


Независимо от того, насколько большой я устанавливаю точности свойство я все еще получаю повторяющиеся 9,999 ...

+0

Звучит как ошибка округления с плавающей запятой. – Powerlord

+0

@Powerlord Я согласен, но мне повезло, что этот конкретный пакет должен был быть точным и был предпочтительнее BigDecimal. – cworner1

ответ

0

ОК, я не был знаком с Apfloat, поэтому я начал читать его документацию.

По-видимому, если вы используете конструктор public Apfloat(String value), то точность числа - это количество цифр в строке.

В этом случае вы указали «25,4», что составляет 3 цифры.

Однако, чтобы обойти эту проблему, вы можете использовать конструктор public Apfloat(String value, long precision), который позволяет вам указать точность, чтобы вы могли обрабатывать числа с более десятичными знаками.

+0

Я установил точность до 100, и она вернулась: 9.9999999999999999999999 ... и т. Д. – cworner1

0

Режим округления не определен. Чтобы получить округленный результат, используйте ApfloatMath.round()

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