Тема: Як працювати з цінами?
Є число 17,30 яке представляє з себе ціну. Потрібно щоб ця ціна скрізь показувалася як 17,30, а не 17.3, 17.300000000456…, 17,30000 і т.п. Пробував double і BigDecimal.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Java → Як працювати з цінами?
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Є число 17,30 яке представляє з себе ціну. Потрібно щоб ця ціна скрізь показувалася як 17,30, а не 17.3, 17.300000000456…, 17,30000 і т.п. Пробував double і BigDecimal.
Як працювати з цінами?
BigDecimal
Ви ж самі все написали
Потрібно щоб ця ціна скрізь показувалася...
Вказуйте що і як саме Вам потрібно відображати - https://docs.oracle.com/javase/tutorial … intro.html
P.S.
Пробував double...
а ось цього не варто робити... бо сумно закінчиться, чи то Java, SQL, ....
Вам треба розрізняти число і його представлення; причому у випадку грошей це треба робити свідомо. Є історія про одного банківського програміста, який в операціях, де було незрозуміло, в який бік округлювати (півцента), написав, щоб цент переказувався йому на рахунок. Думав, що йому буде на пиво раз на місяць - а за тиждень його спіймала служба охорони банку, бо там кілька тисяч накрапало.
Ці 17 гривень 30 копійок звідки взялися? Це абсолютно точна величина чи результат якоїсь операції? Вам у який саме момент треба округлювати? Ці всі питання важливі - якщо округлювати кожну операцію, а хтось (скажімо, податкова) буде округлювати лише кінцеву суму, то ви можете розійтися на кілька копійок. А якщо податкова виявить, що ви недоплатили податок - може бути ОЙ.
Якщо це саме конкретна кінцева сума після округлення, то краще використовуйте ціле для збереження кількості копійок (тобто 1730). Якщо це проміжне значення - то округлюйте при виведенні. BigDecimal - то, звісно, добре, але вам воно, швидше за все, ні до чого, якщо ви не плануєте працювати з трильйонами з точністю до копійки.
Виведення double з двома знаками після коми:
System.out.printf("%.2f", 17.30);
*рука-обличча* тут вже з'ясували, що дабл не треба використовувати...
Це все занадто складно. Java Currency Number format. Якраз те що потрібно.
I doubt it. The problem is that 100 is never 100 if it's a float, it's normally 99.9999999999 or 100.0000001 or something like that.
If you do want to format it that way, you have to define an epsilon, that is, a maximum distance from an integer number, and use integer formatting if the difference is smaller, and a float otherwise.
Something like this would do the trick:
public String formatDecimal(float number) { float epsilon = 0.004f; // 4 tenths of a cent if (Math.abs(Math.round(number) - number) < epsilon) { return String.format("%10.0f", number); // sdb } else { return String.format("%10.2f", number); // dj_segfault } }
Вам треба власне відображення, чи сутність, чим воно насправді є? Ви звичайно можете приховати форматом зайві цифри, але після декількох математичних операцій над такими грошовими значеннями ваш користувач буде дуже здивований результатами.
В джаві є "офіційний" API для грошей, javamoney.github.io, підключається бібліотекою.
Треба щоб воно відображалося як ціни. 2,10 а не 2.1, 10 а не 10.00. І щоб користувач в результаті арифметичних операцій з цими величинами бачив число 96,60 а не 96,000000006…. За посилання дякую, але якось дивно заради такого тягнути в програму цілу бібліотеку.
Це все занадто складно.
Інша тема:
RPC виглядає складно.
Нуууу....
...користувач в результаті арифметичних операцій з цими величинами...
Вам ж порекомендували всі можливі варіанти - BigDecimal, int, long, бібліотеки
....якось дивно заради такого тягнути в програму цілу бібліотеку...
дивно використовувати для цього - float/double, але звісно то Ваша справа...
Хто-небудь наведіть приклад з BigDecimal чи зі ще чимось більш підходящим. Числа зберігаю в BigDeciaml а потім віддаю float в formatDecimal. Ще в Internet зустрічав пораду зберігати дробну частину окремо. Проблеми з неточністю поки що не помітив.
Є чудова книга - Effective Java Joshua Bloch
А статейок в мережі - https://www.baeldung.com/java-money-and-currency ....
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися