powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
25 сообщений из 62, страница 1 из 3
Округление чисел с плавающей запятой!!!!
    #33583922
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, может кто сталкивался.
По какой-то причине при округлении чисел с плавающей запятой, цифра "5" округляется до меньшего, напимер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  ...
  public   static   void  main (String [] args)
    {
       double  d =   13 . 5465 ;
      
      System.out.println("ROUND_HALF_DOWN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_DOWN));
      System.out.println("ROUND_HALF_EVEN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_EVEN));
      System.out.println("  ROUND_HALF_UP = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_UP));
      
     }
 ...

Вывод на экран :

ROUND_HALF_DOWN = 13.546
ROUND_HALF_EVEN = 13.546
ROUND_HALF_UP = 13.546


если же
Код: plaintext
 double  d =   13 . 5465000000001 ;
, то

Вывод на экран :

ROUND_HALF_DOWN = 13.547
ROUND_HALF_EVEN = 13.547
ROUND_HALF_UP = 13.547

Подскажите, каким махером выполнять округление,
чтобы число 13.5465 всё-таки
"превращалось" в 13.547
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584037
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hНарод, может кто сталкивался.
По какой-то причине при округлении чисел с плавающей запятой, цифра "5" округляется до меньшего, напимер:

Советую почитать книгу как хранятся числа с плавующей точкой, и каким образом происходит округление.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584061
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений ПутилинСоветую почитать книгу как хранятся числа с плавующей точкой, и каким образом происходит округление.
Молодца!!! Совет конечно дельный, не к месту ...
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584170
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл!!!!!!
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584178
galisha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и в чем фишка ?
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584265
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
galishaну и в чем фишка ?
Фишка ... ... Всё просто ... пишем свою функцию округления ...
От Java я ожидал большего и был склонен думать, что просто
по своему незнанию делаю округление неправильно, но количество отзывов на мою проблему (особенно на меня произвело незгладимое впечатление выскаживание товарища Евгения Путилина ) наводит на мысль, что глюк всё-таки в библиотеке языка программирования. Хотя могу и ошибаться (это только сугубо моё предположение) и возможно на этом форме найдётся человек, который даст верное решение. Заранее ему спасибо .
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584304
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
...
Подскажите, каким махером выполнять округление,
чтобы число 13.5465 всё-таки
"превращалось" в 13.547
Код: plaintext
1.
bd.setScale( 3 , BigDecimal.ROUND_UP);
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33584461
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozheyko_d andy_h
...
Подскажите, каким махером выполнять округление,
чтобы число 13.5465 всё-таки
"превращалось" в 13.547
Код: plaintext
1.
bd.setScale( 3 , BigDecimal.ROUND_UP);


Фишка в том, что данный вызов (как и при BigDecimal.ROUND_CEILING) "превратит" в 13.547 даже число 13.5461 , что отходит от общих норм, например в MS Excel
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33585521
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h(особенно на меня произвело незгладимое впечатление выскаживание товарища Евгения Путилина ) наводит на мысль, что глюк всё-таки в библиотеке языка программирования.

Какие все умные... блин... Ошибка в библиотеке и все тут!
Если в доке написано, что то делается так, а не иначе, значит это делается так, как написано в доке!
Как говорится: "Дай человеку рыбу - и ты накормишь его один раз. Научи его ловить рыбу - и ты накормишь его на всю жизнь". Так что совет читать книги тебе дали правильно!
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33585875
andy_hНарод, может кто сталкивался.
По какой-то причине при округлении чисел с плавающей запятой, цифра "5" округляется до меньшего, напимер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  ...
  public   static   void  main (String [] args)
    {
       double  d =   13 . 5465 ;
      
      System.out.println("ROUND_HALF_DOWN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_DOWN));
      System.out.println("ROUND_HALF_EVEN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_EVEN));
      System.out.println("  ROUND_HALF_UP = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_UP));
      
     }
 ...

Вывод на экран :

ROUND_HALF_DOWN = 13.546
ROUND_HALF_EVEN = 13.546
ROUND_HALF_UP = 13.546


если же
Код: plaintext
 double  d =   13 . 5465000000001 ;
, то

Вывод на экран :

ROUND_HALF_DOWN = 13.547
ROUND_HALF_EVEN = 13.547
ROUND_HALF_UP = 13.547

Подскажите, каким махером выполнять округление,
чтобы число 13.5465 всё-таки
"превращалось" в 13.547

Предлагаю вспомнить из азов, что число 0.1 (одна десятая) в двоичном виде не представима конечным образом. Число 13.5465 тоже.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 double  d1 =  13 . 5465 ;
 double  d2 =  13 . 546500000001 ;
System.out.println( new  BigDecimal(d1));
System.out.println( new  BigDecimal(d2));
ыщз

 13 . 5464999999999999857891452847979962825775146484375 
 13 . 546500000001000074689727625809609889984130859375 
Отсюда и "странности" с округлениями.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33585893
andy_hНарод, может кто сталкивался.
По какой-то причине при округлении чисел с плавающей запятой, цифра "5" округляется до меньшего, напимер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  ...
  public   static   void  main (String [] args)
    {
       double  d =   13 . 5465 ;
      
      System.out.println("ROUND_HALF_DOWN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_DOWN));
      System.out.println("ROUND_HALF_EVEN = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_EVEN));
      System.out.println("  ROUND_HALF_UP = "+ 
           new  BigDecimal(d).setScale( 3 ,  BigDecimal.ROUND_HALF_UP));
      
     }
 ...

Вывод на экран :

ROUND_HALF_DOWN = 13.546
ROUND_HALF_EVEN = 13.546
ROUND_HALF_UP = 13.546


если же
Код: plaintext
 double  d =   13 . 5465000000001 ;
, то

Вывод на экран :

ROUND_HALF_DOWN = 13.547
ROUND_HALF_EVEN = 13.547
ROUND_HALF_UP = 13.547

Подскажите, каким махером выполнять округление,
чтобы число 13.5465 всё-таки
"превращалось" в 13.547

Предлагаю вспомнить, что число 0.1 (одна десятая) в двоичном виде не представима конечным образом. Число 13.5465 тоже. Друними словами, в типе double они не могут быть представлены точно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 double  d1 =  13 . 5465 ;
 double  d2 =  13 . 546500000001 ;
System.out.println( new  BigDecimal(d1));
System.out.println( new  BigDecimal(d2));
System.out.println( new  BigDecimal("13.5465"));
System.out.println( new  BigDecimal("13.546500000001"));

 13 . 5464999999999999857891452847979962825775146484375 
 13 . 546500000001000074689727625809609889984130859375 
 13 . 5465 
 13 . 546500000001 
Отсюда и "странности" с округлениями.

Типы double и float слудет использовать только в научных расчетах. Чтобы считать деньги, они не подходят.

Для похожести с Excel нужно использовать BigDecimal.ROUND_HALF_UP.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33585998
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hФишка в том, что данный вызов (как и при BigDecimal.ROUND_CEILING) "превратит" в 13.547 даже число 13.5461 , что отходит от общих норм, например в MS Excel
Да, ужас MS Excel это уже обще принятая норма. Сразу видно что человек совершенноне понимает разницу между числом с плавающей точкой и числом с фиксированной точкой.
Еще раз советую почитай какиюнибуть книгу по численным методам и тогда не будет глупых вопросов, человек из Краснодара правильно написал.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586104
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типы double и float слудет использовать только в научных расчетах. Чтобы считать деньги, они не подходят.

Для похожести с Excel нужно использовать BigDecimal.ROUND_HALF_UP.

Почему-то люди сразу думают о деньгах, хотя я работаю в НИИ и рассчёты как раз научные.

BigDecimal.ROUND_HALF_UP - схожести с Excel не даёт (собственно, практически с этой константой мой вопрос и начинался)

" Умникам ", любящим давать советы по прочтению той или иной литературы + филосовские изречения про рыбку, птичку и т.п. и не более того , могу только сказать, что книги безусловно читать надо (кстати, ни автора - ни названия указано не было, просто воздух потрясли), но форум для того и создан (на мой взгляд), чтобы помагать решать возникшие проблемы в быстром порядке.

Теперь о глюках . Может я и слишком резко высказался по этому поводу (с Java я работаю недавно), но в Object Pascal (ток не надо снова умничать :"Вот и пиши на своем Пасквиле" ) есть функция
Код: plaintext
RoundTo()
Код: plaintext
1.
2.
3.
          RoundTo( 1 . 234 , - 2 )           =   1 . 23 
          RoundTo( 1 . 235 , - 2 )           =   1 . 24 
          RoundTo( 1 . 245 , - 2 )           =   1 . 25 
И я просто хотел узнать, если подобный аналог (чтобы результаты совпадали) в Java
В результате я пришёл к выводу, что нужно писать свою функцию, где нужно:
умножать->округлять до целого->делить
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586441
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
Типы double и float слудет использовать только в научных расчетах. Чтобы считать деньги, они не подходят.

Для похожести с Excel нужно использовать BigDecimal.ROUND_HALF_UP.
Почему-то люди сразу думают о деньгах, хотя я работаю в НИИ и рассчёты как раз научные.

Ага, а в НИИ про численные методы не слышали?
andy_h
BigDecimal.ROUND_HALF_UP - схожести с Excel не даёт (собственно, практически с этой константой мой вопрос и начинался)

andy_h
" Умникам ", любящим давать советы по прочтению той или иной литературы + филосовские изречения про рыбку, птичку и т.п. и не более того , могу только сказать, что книги безусловно читать надо (кстати, ни автора - ни названия указано не было, просто воздух потрясли),

Это то что дает поиск на озоне по численным методам Думаю это достаточно?
andy_h
но форум для того и создан (на мой взгляд), чтобы помагать решать возникшие проблемы в быстром порядке.

Теперь о глюках . Может я и слишком резко высказался по этому поводу (с Java я работаю недавно), но в Object Pascal (ток не надо снова умничать :"Вот и пиши на своем Пасквиле" ) есть функция
Код: plaintext
RoundTo()
Код: plaintext
1.
2.
3.
          RoundTo( 1 . 234 , - 2 )           =   1 . 23 
          RoundTo( 1 . 235 , - 2 )           =   1 . 24 
          RoundTo( 1 . 245 , - 2 )           =   1 . 25 
И я просто хотел узнать, если подобный аналог (чтобы результаты совпадали) в Java
В результате я пришёл к выводу, что нужно писать свою функцию, где нужно:
умножать->округлять до целого->делить
Ты что округляеш? тип числа какой? если это так и стоит в программе почему ты думаеш что это не число с фиксированной точкой?
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586478
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
" Умникам ", любящим давать советы по прочтению той или иной литературы + филосовские изречения про рыбку, птичку и т.п. и не более того , могу только сказать, что книги безусловно читать надо (кстати, ни автора - ни названия указано не было, просто воздух потрясли), но форум для того и создан (на мой взгляд), чтобы помагать решать возникшие проблемы в быстром порядке.
...
В результате я пришёл к выводу, что нужно писать свою функцию, где нужно:
умножать->округлять до целого->делить

Мужык, я тебя люблю.
Давай вместе похороним java?

Это же не в какие ворота не лезет, какая тупая язычина. Даже окргулять как паскаль не умеет (не говоря уже про эксель).
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586485
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений
если это так и стоит в
программе почему ты думаеш что это не число с фиксированной
точкой?


потому что по умолчанию числа типа 3.14, 5.44 итд имеют тип double.
т.е.
Код: plaintext
1.
2.
3.
 double  d1 =  3 . 402 ;
 double  d2 =  3 .402D;
 double  d3 =  3 .402F;
d1 и d2 - это одно и тоже число. а d3 - другое.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586585
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений Путилин
Ты что округляеш? тип числа какой? если это так и стоит в программе почему ты думаеш что это не число с фиксированной точкой?

))) Умнейший !!! Что ж Вы всё пишите и пишите, а ответа я так пока не получил. Раз Вы так хорошо разбираетесь в этой теме и жёстко цепляетесь к терминологии. Давайте поступим следующим образом:

1 . Назовём числа 13.5461 и 13.5465 - вещественными .

2 . Напишите мне, ПОЖАЛУЙСТА , последовательность операторов на языке Java , неважно: толи через BigDecimal , толи через DecimalFormat , или любым другим известным Вам способом, но чтобы, при округлении 13.5465 до 3-х знаков после запятой получалось 13.547 ,
а число 13.5461 - 13.546 , соответственно.

И всё ... Мне больше ничего не требуется ...
В противном случае, на данном форуме, можно давать людям однотипные ответы на все их вопросы:
"Читай книгу по Java, EJB, JDBC и пр."
А форум закрыть, за ненадобностью ....
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586701
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Форум, уважаемый, нужен для вопросов, ОТВЕТЫ НА КОТОРЫЕ НЕ ПОЛУЧАЕТСЯ НАЙТИ В КНИГАх!!!
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586727
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   float  roundTo( float  number)
{
     if (number== 13 .5465f)
    {
         return   13 .547f;
    }
     if (number== 13 .5461f)
    {
         return   13 .546f;
    }
     return   0 .0f;
}

:-)
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586729
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин
> Форум, уважаемый, нужен для вопросов, ОТВЕТЫ НА КОТОРЫЕ НЕ
> ПОЛУЧАЕТСЯ НАЙТИ В КНИГАх!!!Тема==Ответить




спокойнее. я тоже не понял. в книге написано, что данный код выведет
1.235, а выводит 1.234.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 import  java.text.*;
 public   class  Decimal {
    public   static   void  main(String[] args) {
       double  d =  1 . 2345 ;
      NumberFormat nf = NumberFormat.getNumberInstance();
      nf.setMaximumFractionDigits( 3 );
      String s = nf.format(d);
      System.out.println(s);
   }
}
  

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586768
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясни мне пожалуйста, почему у меня вот это работает?

Код: plaintext
1.
2.
3.
4.
5.
6.
     public   static   void  main(String[] args)
    {
        test =  new  BigDecimal("13.5465");
        test = test.setScale( 3 , BigDecimal.ROUND_HALF_UP);
        System.out.println("TEST: "+test);
    }

TEST: 13.547
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586787
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел решение:
Код: plaintext
1.
SELECT Round( 1 . 2345 , 3 ) FROM dual

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586788
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин РоманВо!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public   float  roundTo( float  number)
{
     if (number== 13 .5465f)
    {
         return   13 .547f;
    }
     if (number== 13 .5461f)
    {
         return   13 .546f;
    }
     return   0 .0f;
}

:-)

Круто!!!!!! А теперь напиши мне ещё тысяч 5 (примерно столько записей в таблице БД) таких функций, правда значения иногда меняются, но я в тя верю, справишься :-)))))
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586793
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady Кувалдин
> Форум, уважаемый, нужен для вопросов, ОТВЕТЫ НА КОТОРЫЕ НЕ
> ПОЛУЧАЕТСЯ НАЙТИ В КНИГАх!!!Тема==Ответить




спокойнее. я тоже не понял. в книге написано, что данный код выведет
1.235, а выводит 1.234.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 import  java.text.*;
 public   class  Decimal {
    public   static   void  main(String[] args) {
       double  d =  1 . 2345 ;
      NumberFormat nf = NumberFormat.getNumberInstance();
      nf.setMaximumFractionDigits( 3 );
      String s = nf.format(d);
      System.out.println(s);
   }
}
  

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3

Честно говоря, в доке по API я не нашел факта, что он округляет 0.5 до 1 или до 0.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586796
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     public   static   void  main(String[] args) {
        BigDecimal test =  new  BigDecimal( 1 .2345f);
        test = test.setScale( 3 , BigDecimal.ROUND_HALF_UP);
        System.out.println("TEST1: "+test);

        test =  new  BigDecimal( 1 .2345d);
        test = test.setScale( 3 , BigDecimal.ROUND_HALF_UP);
        System.out.println("TEST2: "+test);
    }
System.outTEST1: 1.235
TEST2: 1.234
...
Рейтинг: 0 / 0
25 сообщений из 62, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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