Це два окремі запитання: "Для чого мені використовувати BigDecimal
?" і "Що я взагалі роблю?"
Для BigDecimal
: це трохи хитро, бо вони не роблять одне і те ж . BigDecimal.valueOf(double)
буде використовувати канонічне String
уявлення про double
вартості переданого в екземпляр BigDecimal
об'єкта. Іншими словами: вартість BigDecimal
об’єкта буде такою, яку ви побачите, коли це зробите System.out.println(d)
.
Якщо ви використовуєте new BigDecimal(d)
однак, тоді BigDecimal
спробує представити double
значення якомога точніше . Це зазвичай призводить до набагато більше цифр , які зберігаються , ніж ви хочете. Строго кажучи, це правильніше valueOf()
, але набагато менш інтуїтивно.
У JavaDoc цьому є гарне пояснення:
Результати цього конструктора можуть бути дещо непередбачуваними. Можна припустити, що написання new BigDecimal(0.1)
на Java створює значення, BigDecimal
яке точно дорівнює 0,1 (немасштабне значення 1 зі шкалою 1), але насправді воно дорівнює 0,1000000000000000055511151231257827021181583404541015625. Це тому, що 0,1 не можна представити точно як double
(або, як наслідок, як двійкову частку будь-якої кінцевої довжини). Таким чином, значення, яке передається конструктору, не точно дорівнює 0,1, незважаючи на видимість.
Загалом, якщо результат однаковий (тобто не у випадку BigDecimal
, а в більшості інших випадків), тоді valueOf()
слід віддати перевагу: він може виконувати кешування загальних значень (як показано далі Integer.valueOf()
) і навіть може змінити поведінку кешування без абонента потрібно змінити. new
буде завжди інстанцірует нове значення, навіть якщо не потрібно (кращий приклад: new Boolean(true)
проти Boolean.valueOf(true)
).