Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Округление в JAVA  [new]
vladik_k
Member

Откуда:
Сообщений: 60
BigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

а как бы мне произвести округление не до целого, а до порядка сотен, т.е. что мне надо сделать, чтобы получить 45.46?
2 ноя 06, 09:40    [3345187]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Vladimir Kozlov
Member

Откуда: Игогоевск-на-Усяве, учреждение ИТК-6313
Сообщений: 1085
vladik_k
BigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

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


round(45.457*100)/100.00
2 ноя 06, 10:46    [3345656]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Ruslan.Isbarov
Member

Откуда: St. Petersburg
Сообщений: 1140
BigDecimal x = new BigDecimal("45.457");
x = x.setScale(2, BigDecimal.ROUND_HALF_UP); /* 2 - количество знаков после запятой */

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

Округлит до 45.46
2 ноя 06, 10:49    [3345680]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Ruslan.Isbarov
Member

Откуда: St. Petersburg
Сообщений: 1140
Vladimir Kozlov
vladik_k
BigDecimal x = new BigDecimal("45.457");
System.out.println(x.toBigInteger()); -- вывидет 46

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


round(45.457*100)/100.00


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

Почитайте тут
2 ноя 06, 10:50    [3345690]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Vladimir Kozlov
Member

Откуда: Игогоевск-на-Усяве, учреждение ИТК-6313
Сообщений: 1085
Ruslan.Isbarov
Vladimir Kozlov


round(45.457*100)/100.00


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

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


Почитал. Согласен с тем что в финансовых расчетах это опасно. Но, если уж у человека возникла необходимость в округлении, значит исходные данные скорее всего уже не годятся для финансовых расчетов, возможно это могут быть какие-то физические либо математические расчеты. Если уж округлить третий знак, то по сравнению с этим то что делается в 10-12 знаке double - очень маленькая погрешность :)
2 ноя 06, 11:25    [3346007]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
vladik_k
Member

Откуда:
Сообщений: 60
а как округлить число, например: 4.5635 не до 4.564, а до 4.563?
2 ноя 06, 15:28    [3348184]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
^ozzy^
Member

Откуда:
Сообщений: 466
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.
3 ноя 06, 00:45    [3350693]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
vladik_k
Member

Откуда:
Сообщений: 60
есть непонятка! :)

пишу:

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

ПОЧЕМУ ТАК? В одном случае округлило так, как надо, а в другом - нет????
4 ноя 06, 12:26    [3356649]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
mimoprohodil
Guest
Да и в другом случае округлило правильно - перечитайте описание:

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.
4 ноя 06, 17:55    [3357107]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
IDVsbruck
Member

Откуда: Украина
Сообщений: 4260
А если нужно не для вычислений, а для простого вывода строки, то

String aaa = new java.text.DecimalFormat("0.00").format(YourNumber);
11 ноя 06, 20:25    [3387090]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Али-баба
Member [заблокирован]

Откуда:
Сообщений: 41
Подскажите как преобразовать число к нормальному виду:

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

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

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

Как сделать чтобы число в buff ложилось в нормальном виде.
15 ноя 06, 15:08    [3404265]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
LINUXER
Member

Откуда:
Сообщений: 1359
Али-баба
Подскажите как преобразовать число к нормальному виду:

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

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

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

Как сделать чтобы число в buff ложилось в нормальном виде.

javax.swing.text.NumberFormatter?
15 ноя 06, 15:49    [3404655]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Али-баба
Member [заблокирован]

Откуда:
Сообщений: 41
Вот мне предложили такой вариант:

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

но все равно получаеться не универсально - не всегда известно сколько знаков после запятой. Да и результат получаеться с запятой вместо точки - видно зависит от настроек компьютера.
15 ноя 06, 18:22    [3405892]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Округление в JAVA  [new]
Tice
Member

Откуда:
Сообщений: 40
Вот к размышлению :
Нуна округлять всегда вниз до 2 знаков после запятой. Входной и выходной параметр double. Используем BigDecimal.ROUND_DOWN.

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

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 :) но использовали...
18 янв 08, 19:29    [5174497]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Округление в JAVA  [new]
igvar
Member

Откуда: Украина, Киев
Сообщений: 5
BigDecimal d = new BigDecimal(1.555);
System.out.println(d.setScale(2, RoundingMode.HALF_UP));

получаем 1.55

почему?
27 сен 10, 15:20    [9507939]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
календаревед
Member

Откуда:
Сообщений: 352
наверное из-за того, что:

		BigDecimal d = new BigDecimal(1.555);
		System.out.println(d);
		System.out.println(d.setScale(2, RoundingMode.HALF_UP));

результат:
1.5549999999999999378275106209912337362766265869140625
1.55

		BigDecimal d = new BigDecimal(1.5550000000001);
		System.out.println(d);
		System.out.println(d.setScale(2, RoundingMode.HALF_UP));
результат:
1.55500000000010007994433181011117994785308837890625
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
27 сен 10, 15:54    [9508278]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
igvar
Member

Откуда: Украина, Киев
Сообщений: 5
со стандартом IEEE754 знаком ;)
значение 1.554999999999999937... видел. но в процессе установки scale = 2 должно выполнятся округления вверх (в соответствии с режимом округления RoundingMode.HALF_UP). каким образом тогда выполняется округление, если на выходе мы получаем 1.55? получается, если исходное значение не может быть точно представлено в виде числа с плавающей запятой, то и округление такого неточного значения приводит к неточному результату?
27 сен 10, 17:06    [9509084]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
igvar
Member

Откуда: Украина, Киев
Сообщений: 5
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.
29 сен 10, 11:54    [9521318]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Округление в JAVA  [new]
grok
Member

Откуда:
Сообщений: 1204
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?
26 дек 11, 15:22    [11827240]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 15964
grok
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?

А смысл?
26 дек 11, 15:35    [11827346]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
забыл ник
Member

Откуда:
Сообщений: 1927
Смысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01
26 дек 11, 15:46    [11827459]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
grok
Member

Откуда:
Сообщений: 1204
Blazkowicz
grok
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ?

А смысл?


слово Big пугает
особенно когда надо округлить миллион чисел
26 дек 11, 16:30    [11827851]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 15964
забыл ник
Смысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01

Как-как? Т.е. мы округлим double до 2х знаков после запятой. Получим десятичную погрешность примерно соизмеримую со значением, на которое мы округлили, и это будет важно в каких-то там расчетах?
26 дек 11, 16:31    [11827853]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
забыл ник
Member

Откуда:
Сообщений: 1927
автор
Как-как? Т.е. мы округлим double до 2х знаков после запятой. Получим десятичную погрешность примерно соизмеримую со значением, на которое мы округлили, и это будет важно в каких-то там расчетах?


Ну например тебе надо заскэйлить картинку, не пихать же туда BigDecimal
26 дек 11, 16:33    [11827868]     Ответить | Цитировать Сообщить модератору
 Re: Округление в JAVA  [new]
Blazkowicz
Member

Откуда: http://rsdn.ru/forum/java
Сообщений: 15964
grok
особенно когда надо округлить миллион чисел

Ну, для массивных обработок, можно к разным ухищрениям прибегать. Начните с деление и умножения на 100.
26 дек 11, 16:38    [11827930]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Java Ответить
 
Разработка веб приложений с помощью Visual Studio 2010   29 000 руб.
Java сквозной курс от а до я. от java программирования до разработки java ee 7 web и
ejb приложений с использованием баз данных (на примере mysql)
  57 000 руб.
Создание запросов в SQL Server 2012   29 500 руб.
Администрирование баз данных Microsoft SQL Server   29 500 руб.
Основы web-программирования. HTML, CSS, PHP   26 990 руб.