powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление в JAVA
25 сообщений из 34, страница 1 из 2
Округление в JAVA
    #34099619
vladik_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

а как бы мне произвести округление не до целого, а до порядка сотен, т.е. что мне надо сделать, чтобы получить 45.46?
...
Рейтинг: 0 / 0
Округление в JAVA
    #34099879
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladik_kBigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

а как бы мне произвести округление не до целого, а до порядка сотен, т.е. что мне надо сделать, чтобы получить 45.46?

round(45.457*100)/100.00
...
Рейтинг: 0 / 0
Округление в JAVA
    #34099892
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
BigDecimal x =  new  BigDecimal("45.457");
x = x.setScale( 2 , BigDecimal.ROUND_HALF_UP); /* 2 - количество знаков после запятой */

System.out.println("x = " + x.doubleValue());  

Округлит до 45.46
...
Рейтинг: 0 / 0
Округление в JAVA
    #34099899
Фотография Ruslan.Isbarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Kozlov vladik_kBigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

а как бы мне произвести округление не до целого, а до порядка сотен, т.е. что мне надо сделать, чтобы получить 45.46?

round(45.457*100)/100.00

А вот этого стоит опасаться!

Почитайте тут
...
Рейтинг: 0 / 0
Округление в JAVA
    #34100077
Vladimir Kozlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ruslan.Isbarov Vladimir Kozlov

round(45.457*100)/100.00

А вот этого стоит опасаться!

Почитайте тут

Почитал. Согласен с тем что в финансовых расчетах это опасно. Но, если уж у человека возникла необходимость в округлении, значит исходные данные скорее всего уже не годятся для финансовых расчетов, возможно это могут быть какие-то физические либо математические расчеты. Если уж округлить третий знак, то по сравнению с этим то что делается в 10-12 знаке double - очень маленькая погрешность :)
...
Рейтинг: 0 / 0
Округление в JAVA
    #34101324
vladik_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как округлить число, например: 4.5635 не до 4.564, а до 4.563?
...
Рейтинг: 0 / 0
Округление в JAVA
    #34102547
^ozzy^
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
BigDecimal bigDecimal =  new  BigDecimal("45.457");
bigDecimal = bigDecimal.setScale( 3 , [roundingMode]);
System.out.println(bigDecimal.doubleValue());

where [roundingMode] is:

BigDecimal.ROUND_UP
Rounding mode to round away from zero. Always increments the digit prior to a nonzero discarded fraction. Note that this rounding mode never decreases the magnitude of the calculated value.

BigDecimal.ROUND_DOWN
Rounding mode to round towards zero. Never increments the digit prior to a discarded fraction (i.e., truncates). Note that this rounding mode never increases the magnitude of the calculated value.

BigDecimal.ROUND_CEILING
Rounding mode to round towards positive infinity. If the BigDecimal is positive, behaves as for ROUND_UP; if negative, behaves as for ROUND_DOWN. Note that this rounding mode never decreases the calculated value.

BigDecimal.ROUND_FLOOR
Rounding mode to round towards negative infinity. If the BigDecimal is positive, behave as for ROUND_DOWN; if negative, behave as for ROUND_UP. Note that this rounding mode never increases the calculated value.

BigDecimal.ROUND_HALF_UP
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. Behaves as for ROUND_UP if the discarded fraction is >= 0.5; otherwise, behaves as for ROUND_DOWN. Note that this is the rounding mode that most of us were taught in grade school.

ROUND_HALF_DOWN
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. Behaves as for ROUND_UP if the discarded fraction is > 0.5; otherwise, behaves as for ROUND_DOWN.

BigDecimal.ROUND_HALF_EVEN
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. Behaves as for ROUND_HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for ROUND_HALF_DOWN if it's even. Note that this is the rounding mode that minimizes cumulative error when applied repeatedly over a sequence of calculations.

BigDecimal.ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. If this rounding mode is specified on an operation that yields an inexact result, an ArithmeticException is thrown.
...
Рейтинг: 0 / 0
Округление в JAVA
    #34105590
vladik_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть непонятка! :)

пишу:

BigDecimal bd = new BigDecimal("45.455");
bd = bd.setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println("bd = "+bd.doubleValue());

System.out.println("-----------------------------------------------------");

BigDecimal bc = new BigDecimal("45.455000001");
bc = bc.setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println("bc = "+bc.doubleValue());


выводит:

bd = 45.45
----------------------
bc = 45.46

ПОЧЕМУ ТАК? В одном случае округлило так, как надо, а в другом - нет????
...
Рейтинг: 0 / 0
Округление в JAVA
    #34105839
mimoprohodil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и в другом случае округлило правильно - перечитайте описание:

BigDecimal.ROUND_HALF_DOWN
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. Behaves as for ROUND_UP if the discarded fraction is > 0.5 ; otherwise, behaves as for ROUND_DOWN.

BigDecimal.ROUND_UP
Rounding mode to round away from zero. Always increments the digit prior to a nonzero discarded fraction. Note that this rounding mode never decreases the magnitude of the calculated value.
...
Рейтинг: 0 / 0
Округление в JAVA
    #34121437
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если нужно не для вычислений, а для простого вывода строки, то

String aaa = new java.text.DecimalFormat("0.00").format(YourNumber);
...
Рейтинг: 0 / 0
Округление в JAVA
    #34130541
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как преобразовать число к нормальному виду:

String buff = Double.toString(rs.getDouble(colName));

в результате число вида
2342423543
получаеться вида:
2.342423543E9

число вида
980
в виде
980.0

Как сделать чтобы число в buff ложилось в нормальном виде.
...
Рейтинг: 0 / 0
Округление в JAVA
    #34130713
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Али-бабаПодскажите как преобразовать число к нормальному виду:

String buff = Double.toString(rs.getDouble(colName));

в результате число вида
2342423543
получаеться вида:
2.342423543E9

число вида
980
в виде
980.0

Как сделать чтобы число в buff ложилось в нормальном виде.
javax.swing.text.NumberFormatter?
...
Рейтинг: 0 / 0
Округление в JAVA
    #34131327
Али-баба
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот мне предложили такой вариант:

nf = new DecimalFormat("0.####");
String buff = new String(nf.format(number));

но все равно получаеться не универсально - не всегда известно сколько знаков после запятой. Да и результат получаеться с запятой вместо точки - видно зависит от настроек компьютера.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Округление в JAVA
    #35072651
Tice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот к размышлению :
Нуна округлять всегда вниз до 2 знаков после запятой. Входной и выходной параметр double. Используем BigDecimal.ROUND_DOWN.

Почти всегда работает правильно ;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 import  java.math.BigDecimal;


 public   class  RoundDown
{

   public  RoundDown()
  {
  }

   public   static   double  roundDownScale2( double  aValue)
  {
    BigDecimal decimal =  new  BigDecimal(aValue);
//    decimal = decimal.setScale(10,BigDecimal.ROUND_UP);
    decimal = decimal.setScale( 2 ,BigDecimal.ROUND_DOWN);
     double  result = decimal.doubleValue();
     return  result;
  }

   public   static   void  main(String[] args)
  {
     double  value =  28 .68d;
     double  valueRounded = roundDownScale2(value);
    System.out.println("value = " + value);
    System.out.println("valueRounded = " + valueRounded);

    value =  28 .681d;
    valueRounded = roundDownScale2(value);
    System.out.println("value = " + value);
    System.out.println("valueRounded = " + valueRounded);
    
  }
  
}

Погрешности погрешности погрешности....
Попробуйте раскоментировать строчку в методе ;)

З.Ы. мона канешно не использовать BigDecimal :) но использовали...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Округление в JAVA
    #36868151
igvar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BigDecimal d = new BigDecimal(1.555);
System.out.println(d.setScale(2, RoundingMode.HALF_UP));

получаем 1.55

почему?
...
Рейтинг: 0 / 0
Округление в JAVA
    #36868249
наверное из-за того, что:

Код: plaintext
1.
2.
3.
		BigDecimal d =  new  BigDecimal( 1 . 555 );
		System.out.println(d);
		System.out.println(d.setScale( 2 , RoundingMode.HALF_UP));

результат:
1.55 49 999999999999378275106209912337362766265869140625
1.55

Код: plaintext
1.
2.
3.
		BigDecimal d =  new  BigDecimal( 1 . 5550000000001 );
		System.out.println(d);
		System.out.println(d.setScale( 2 , RoundingMode.HALF_UP));
результат:
1.55 50 0000000010007994433181011117994785308837890625
1.56

См. binary float point - http://www.h-schmidt.net/FloatApplet/IEEE754.html
авторNot every decimal number can be expressed exactly as a floating point number
...
Рейтинг: 0 / 0
Округление в JAVA
    #36868394
igvar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
со стандартом IEEE754 знаком ;)
значение 1.55 49 99999999999937... видел. но в процессе установки scale = 2 должно выполнятся округления вверх (в соответствии с режимом округления RoundingMode.HALF_UP). каким образом тогда выполняется округление, если на выходе мы получаем 1.55? получается, если исходное значение не может быть точно представлено в виде числа с плавающей запятой, то и округление такого неточного значения приводит к неточному результату?
...
Рейтинг: 0 / 0
Округление в JAVA
    #36871861
igvar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
String str =  Double .valueOf( 1 . 555 ).toString();
BigDecimal d =  new  BigDecimal(str);
System.out.println(d.setScale( 2 , RoundingMode.HALF_UP));

результат:  1 . 56 

конструктор BigDecimal(String val): This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn't suffer from the unpredictability of the BigDecimal(double) constructor.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Округление в JAVA
    #37593642
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593668
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokа без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
А смысл?
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593695
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593788
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczgrokа без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
А смысл?

слово Big пугает
особенно когда надо округлить миллион чисел
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593789
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл никСмысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01
Как-как? Т.е. мы округлим double до 2х знаков после запятой. Получим десятичную погрешность примерно соизмеримую со значением, на которое мы округлили, и это будет важно в каких-то там расчетах?
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593793
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак-как? Т.е. мы округлим double до 2х знаков после запятой. Получим десятичную погрешность примерно соизмеримую со значением, на которое мы округлили, и это будет важно в каких-то там расчетах?

Ну например тебе надо заскэйлить картинку, не пихать же туда BigDecimal
...
Рейтинг: 0 / 0
Округление в JAVA
    #37593804
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grokособенно когда надо округлить миллион чисел
Ну, для массивных обработок, можно к разным ухищрениям прибегать. Начните с деление и умножения на 100.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление в JAVA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]