Це два окремі запитання: "Для чого мені використовувати 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)).