1 Востаннє редагувалося javascriptIsLife (31.05.2020 15:11:04)

Тема: Як працювати з цінами?

Є число 17,30 яке представляє з себе ціну. Потрібно щоб ця ціна скрізь показувалася як 17,30, а не 17.3, 17.300000000456…, 17,30000 і т.п. Пробував double і BigDecimal.

2

Re: Як працювати з цінами?

https://docs.oracle.com/javase/8/docs/a … rency.html

3 Востаннє редагувалося fed_lviv (31.05.2020 15:53:50)

Re: Як працювати з цінами?

javascriptIsLife написав:

Як працювати з цінами?

javascriptIsLife написав:

BigDecimal

Ви ж самі все написали :)

javascriptIsLife написав:

Потрібно щоб ця ціна скрізь показувалася...

Вказуйте що і як саме Вам потрібно відображати - https://docs.oracle.com/javase/tutorial … intro.html
P.S.

javascriptIsLife написав:

Пробував double...

а ось цього не варто робити... :) бо сумно закінчиться, чи то Java, SQL, ....

Подякували: koala1

4 Востаннє редагувалося koala (31.05.2020 16:16:32)

Re: Як працювати з цінами?

Вам треба розрізняти число і його представлення; причому у випадку грошей це треба робити свідомо. Є історія про одного банківського програміста, який в операціях, де було незрозуміло, в який бік округлювати (півцента), написав, щоб цент переказувався йому на рахунок. Думав, що йому буде на пиво раз на місяць - а за тиждень його спіймала служба охорони банку, бо там кілька тисяч накрапало.
Ці 17 гривень 30 копійок звідки взялися? Це абсолютно точна величина чи результат якоїсь операції? Вам у який саме момент треба округлювати? Ці всі питання важливі - якщо округлювати кожну операцію, а хтось (скажімо, податкова) буде округлювати лише кінцеву суму, то ви можете розійтися на кілька копійок. А якщо податкова виявить, що ви недоплатили податок - може бути ОЙ.
Якщо це саме конкретна кінцева сума після округлення, то краще використовуйте ціле для збереження кількості копійок (тобто 1730). Якщо це проміжне значення - то округлюйте при виведенні. BigDecimal - то, звісно, добре, але вам воно, швидше за все, ні до чого, якщо ви не плануєте працювати з трильйонами з точністю до копійки.
Виведення double з двома знаками після коми:

System.out.printf("%.2f", 17.30);

5

Re: Як працювати з цінами?

*рука-обличча* тут вже з'ясували, що дабл не треба використовувати...

6 Востаннє редагувалося javascriptIsLife (31.05.2020 18:26:54)

Re: Як працювати з цінами?

Це все занадто складно. 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
  }
}

7

Re: Як працювати з цінами?

Вам треба власне відображення, чи сутність, чим воно насправді є? Ви звичайно можете приховати форматом зайві цифри, але після декількох математичних операцій над такими грошовими значеннями ваш користувач буде дуже здивований результатами.

В джаві є "офіційний" API для грошей, javamoney.github.io, підключається бібліотекою.

Подякували: koala1

8

Re: Як працювати з цінами?

Треба щоб воно відображалося як ціни. 2,10 а не 2.1, 10 а не 10.00. І щоб користувач в результаті арифметичних операцій з цими величинами бачив число 96,60 а не 96,000000006…. За посилання дякую, але якось дивно заради такого тягнути в програму цілу бібліотеку.

9

Re: Як працювати з цінами?

javascriptIsLife написав:

Це все занадто складно.

Інша тема:

javascriptIsLife написав:

RPC виглядає складно.

Нуууу....  :D

javascriptIsLife написав:

...користувач в результаті арифметичних операцій з цими величинами...

:) Вам ж порекомендували всі можливі варіанти - BigDecimal, int, long, бібліотеки

javascriptIsLife написав:

....якось дивно заради такого тягнути в програму цілу бібліотеку...

*FACEPALM* дивно використовувати для цього - float/double, але звісно то Ваша справа...

Подякували: leofun011

10

Re: Як працювати з цінами?

Хто-небудь наведіть приклад з BigDecimal чи зі ще чимось більш підходящим. Числа зберігаю в BigDeciaml а потім віддаю float в formatDecimal. Ще в Internet зустрічав пораду зберігати дробну частину окремо. Проблеми з неточністю поки що не помітив.

11

Re: Як працювати з цінами?

Є чудова книга -  Effective Java Joshua Bloch
А статейок в мережі - https://www.baeldung.com/java-money-and-currency ....

Подякували: Lujok1