Робота BigDecimal

Основи мови Java

У програмі необхідно обчислювати дані із заданою точністю. Рекомендують використовувати BigDecimal. Використовував його у такому вигляді:

В результаті при виведенні на консоль отримую числа не з 4 знаками після коми (хоча такі теж є і їхня більшість), а з 5, 6 і навіть числа виду 3.638E-12.

Підкажіть, будь ласка, що я зробив не так. Або підкажіть інший спосіб, який працює.

Далі це число використовується наступним чином: необхідно отримати три знаки після коми у числа L, це три знаки визначають яка частина відрізка припадає на дане число, наприклад, ми отримали tmp=0.491, отже відрізок, наприклад, від 45 до 46 необхідно розділити на 1000 та обчислити необхідний параметр на відстані 45.491 використовуючи відповідну екстраполяцію. Не знаю чи пояснив.

Так, я хочу округлити отримане число до 0,001. Бажано, щоб 1,1119 давало 1,112, але якщо дасть 1,111, теж можна.

Цей код працює, але не набагато краще, ніж колись, оскільки іноді замість 0,012 зустрічаються числа 0,01201. А якщо подається число виду 1Е-12, то і на виході виходить число зі ступенем -12, хоча має бути 0.

Після невеликих експериментів я помітив, що параметр MathContext(3) задає не кількість символів після коми, а кількість символів у великих числах в цілому, наприклад, якщо задати MathContext(6), то на виході можна отримати число 658792 або 658,251, але загальне кількість цифр залишиться постійною, з числами виду 1е-n взагалі працює не коректно, на мій погляд.

Напевно, доведеться писати свій метод округлення, швидше буде.

to ogre: навряд чи це комусь знадобиться, всі користуються BigDecimal

2ogre Вибачте, що втручаюся, але теж зацікавився вашою проблемою. Завівневеликий тестовий проект і спробував повозитися з BigDecimal, почитав посилання, наведене MidNight^er. Ось що приблизно вийшло:

Висновок цього коду вийшов ось такий:

Схоже, що всі приклади, які ви наводили, округляються досить адекватно.

Шановний 7biohazard7 це чудово, що ви втручаєтеся, тому що це допоможе і мені, і комусь ще правильно працювати з BigDecimal. Наведений вами приклад у мене також працює коректно. Нижче наведу результати порівняння роботи коду мого методу та BigDecimal. Обмовлюся відразу не хочу сказати, що мій метод кращий і правильніший, швидше за все це не так.

Результат на виході:

Які числа подаватимуться на вхід я контролювати не можу. Можливо, такі цифри виходять через не зовсім правильного використання даного методу. Якщо так, то будь ласка вкажіть на помилку. З висновку взагалі склалося враження, що при такій формі використання BigDecimal, задається кількість символів в отриманому результаті. Чи може бути це пов'язано, що програма компілюється і запускається на 64bit системі? Правда такого бути не повинно, тому що має зберігатися переносимість.