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

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

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

round(45.457*100)/100.00
...
Рейтинг: 0 / 0
02.11.2006, 10:49:13
    #34099892
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Код: 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
02.11.2006, 10:50:41
    #34099899
Ruslan.Isbarov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
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
02.11.2006, 11:25:34
    #34100077
Vladimir Kozlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Ruslan.Isbarov Vladimir Kozlov

round(45.457*100)/100.00

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

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

Почитал. Согласен с тем что в финансовых расчетах это опасно. Но, если уж у человека возникла необходимость в округлении, значит исходные данные скорее всего уже не годятся для финансовых расчетов, возможно это могут быть какие-то физические либо математические расчеты. Если уж округлить третий знак, то по сравнению с этим то что делается в 10-12 знаке double - очень маленькая погрешность :)
...
Рейтинг: 0 / 0
02.11.2006, 15:28:22
    #34101324
vladik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
а как округлить число, например: 4.5635 не до 4.564, а до 4.563?
...
Рейтинг: 0 / 0
03.11.2006, 00:45:51
    #34102547
^ozzy^
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Код: 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
04.11.2006, 12:26:29
    #34105590
vladik_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
есть непонятка! :)

пишу:

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
04.11.2006, 17:55:54
    #34105839
mimoprohodil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Да и в другом случае округлило правильно - перечитайте описание:

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
11.11.2006, 20:25:21
    #34121437
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
А если нужно не для вычислений, а для простого вывода строки, то

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

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

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

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

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

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

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

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

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

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

но все равно получаеться не универсально - не всегда известно сколько знаков после запятой. Да и результат получаеться с запятой вместо точки - видно зависит от настроек компьютера.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.01.2008, 19:29:10
    #35072651
Tice
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Вот к размышлению :
Нуна округлять всегда вниз до 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
Период между сообщениями больше года.
27.09.2010, 15:20:20
    #36868151
igvar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
BigDecimal d = new BigDecimal(1.555);
System.out.println(d.setScale(2, RoundingMode.HALF_UP));

получаем 1.55

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

Код: 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
27.09.2010, 17:06:51
    #36868394
igvar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
со стандартом IEEE754 знаком ;)
значение 1.55 49 99999999999937... видел. но в процессе установки scale = 2 должно выполнятся округления вверх (в соответствии с режимом округления RoundingMode.HALF_UP). каким образом тогда выполняется округление, если на выходе мы получаем 1.55? получается, если исходное значение не может быть точно представлено в виде числа с плавающей запятой, то и округление такого неточного значения приводит к неточному результату?
...
Рейтинг: 0 / 0
29.09.2010, 11:54:45
    #36871861
igvar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Код: 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
Период между сообщениями больше года.
26.12.2011, 15:22:05
    #37593642
grok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
...
Рейтинг: 0 / 0
26.12.2011, 15:35:14
    #37593668
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
grokа без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
А смысл?
...
Рейтинг: 0 / 0
26.12.2011, 15:46:25
    #37593695
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Смысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01
...
Рейтинг: 0 / 0
26.12.2011, 16:30:49
    #37593788
grok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Округление в JAVA
Blazkowiczgrokа без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
А смысл?

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

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


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