powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
62 сообщений из 62, показаны все 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
Округление чисел с плавающей запятой!!!!
    #33586799
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин

> Честно говоря, в доке по API я не нашел факта, что он округляет 0.5 до 1 или до 0.Тема==Ответить




Rounding
DecimalFormat uses half-even rounding (see ROUND_HALF_EVEN) for formatting.







ROUND_HALF_EVEN

public static final int 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.

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

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586824
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел исходники класса BigDecimal. Вот:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
    /**
     * Translates a <code>double</code> into a BigDecimal.  The scale
     * of the BigDecimal is the smallest value such that
     * <tt>(10<sup>scale</sup> * val)</tt> is an integer.
     * <p>
     * Note: the results of this constructor can be somewhat unpredictable.
     * One might assume that <tt>new BigDecimal(.1)</tt> is exactly equal
     * to .1, but it is actually equal
     * to .1000000000000000055511151231257827021181583404541015625.
     * This is so because .1 cannot be represented exactly as a double
     * (or, for that matter, as a binary fraction of any finite length).
     * Thus, the long value that is being passed <i>in</i> to the constructor 
     * is not exactly equal to .1, appearances notwithstanding.
     * <p>
     * The (String) constructor, on the other hand, is perfectly predictable:
     * <tt>new BigDecimal(".1")</tt> is <i>exactly</i> equal to .1, as one
     * would expect.  Therefore, it is generally recommended that the (String)
     * constructor be used in preference to this one.
     *
     * @param val <code>double</code> value to be converted to BigDecimal.
     * @throws NumberFormatException <tt>val</tt> if <tt>val</tt> is
     *         infinite or NaN.
     */
     public  BigDecimal( double  val) {
	 if  ( Double .isInfinite(val) ||  Double .isNaN(val))
	     throw   new  NumberFormatException("Infinite or NaN");

	/*
	 * Translate the double into sign, exponent and mantissa, according
	 * to the formulae in JLS, Section 20.10.22.
	 */
	 long  valBits =  Double .doubleToLongBits(val);
	 int  sign = ((valBits >>  63 )== 0  ?  1  : - 1 );
	 int  exponent = ( int ) ((valBits >>  52 ) & 0x7ffL);
	 long  mantissa = (exponent== 0  ? (valBits & ((1L<< 52 ) -  1 )) <<  1 
				     : (valBits & ((1L<< 52 ) -  1 )) | (1L<< 52 ));
	exponent -=  1075 ;
	/* At this point, val == sign * mantissa * 2**exponent */

	/*
	 * Special case zero to to supress nonterminating normalization
	 * and bogus scale calculation.
	 */
	 if  (mantissa ==  0 ) {
	    intVal = BigInteger.ZERO;
	     return ;
	}

	/* Normalize */
	 while ((mantissa &  1 ) ==  0 ) {    /*  i.e., Mantissa is even */
	    mantissa >>=  1 ;
	    exponent++;
	}

	/* Calculate intVal and scale */
	intVal = BigInteger.valueOf(sign*mantissa);
	 if  (exponent <  0 ) {
	    intVal = intVal.multiply(BigInteger.valueOf( 5 ).pow(-exponent));
	    scale = -exponent;
	}  else   if  (exponent >  0 ) {
	    intVal = intVal.multiply(BigInteger.valueOf( 2 ).pow(exponent));
	}
    }
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586835
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
1 . Назовём числа 13.5461 и 13.5465 - вещественными .


Остановись. Помедитируй.

Запись 13.5461 может представлять вещественное число с фиксированной точной, а может представлять вещественное число с плавающей точкой.

Проглядывает свет в конце тунеля?


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


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
     public   static   double  roundUp( double  value,  int  digits) {
         double  power = precalculated_powers[digits]; // = Math.pow(10, digits);
         return  ( double ) Math.round(value * power) / power;
    }

     public   static   double  roundUp2( double  value,  int  digits) {
         return   new  BigDecimal(value).setScale( 16 , BigDecimal.ROUND_HALF_UP).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

     public   static   double  roundUp3( double  value,  int  digits) {
         return   new  BigDecimal( Double .toString(value)).setScale(digits, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


И всё ... Мне больше ничего не требуется ...

Отнюдь!
Тебе требуется знание двойичной и десятичных систем счисления, знание десятичных дробей и двух способов представления вещественных чисел.

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


В противном случае, на данном форуме, можно давать людям однотипные ответы на все их вопросы:
"Читай книгу по Java, EJB, JDBC и пр."
А форум закрыть, за ненадобностью ....

А как тебе идея, что всё что нужно тебе сказали в первых нескольких ответах?
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586836
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* Note: the results of this constructor can be somewhat unpredictable.
* One might assume that <tt>new BigDecimal(.1)</tt> is exactly equal
* to .1, but it is actually equal
* to .1000000000000000055511151231257827021181583404541015625.
* This is so because .1 cannot be represented exactly as a double
* (or, for that matter, as a binary fraction of any finite length).
* Thus, the long value that is being passed <i>in</i> to the constructor
* is not exactly equal to .1, appearances notwithstanding.
* <p>
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586844
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что, andy_h, могу посоветовать вам преобразовывать double-значения в String-значения.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586884
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин РоманОбъясни мне пожалуйста, почему у меня вот это работает?

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

TEST: 13.547

Объясняю: "13.5465" - строка, 13.5465 - число
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586932
andy_h Кувалдин РоманОбъясни мне пожалуйста, почему у меня вот это работает?

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

TEST: 13.547

Объясняю: "13.5465" - строка, 13.5465 - число
Вы бы вдумались в то, что Вам другие говорят. Если какие-то слова в ответе не понятны - спросите.

Моя жена отнюдь не проргаммист и не математик, но в отличие от Вас, тему с округлениями усвоила с первого раза. Тогда я ей демострировал нечто вроде этого ( только на Visual Basic'е ):
Код: plaintext
1.
2.
3.
4.
5.
System.out.println( 0 . 1  *  3  ==  0 . 3 );      
System.out.println( 0 . 1  +  0 . 1  +  0 . 1  ==  0 . 3 );

false
false
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586938
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
....
Остановись. Помедитируй.
...

Код: plaintext
1.
2.
3.
4.
5.
     public   static   double  roundUp( double  value,  int  digits) {
         double  power = precalculated_powers[digits]; // = Math.pow(10, digits);
         return  ( double ) Math.round(value * power) / power;
    }



andy_h
...
В результате я пришёл к выводу, что нужно писать свою функцию, где нужно:
умножать->округлять до целого->делить
...


Теперь сам остановись, помедитируй .... И подумай, что нового ты предложил?
тоже самое:
писать свою функцию, где именно нужно:
умножать->округлять до целого->делить

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

Это же не в какие ворота не лезет, какая тупая язычина.
Даже окргулять как паскаль не умеет (не говоря уже про эксель).

Над этим тоже подумай
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33586969
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hТеперь сам остановись, помедитируй .... И подумай, что нового ты предложил?


А разве я должен был предложить что-то новое?

Открой зёнки, почитай что ты писал:

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


Даже волшебное слово вспомнил..., а тут взял и обкакался.

andyНад этим тоже подумай
Над чем? Над моими чувствами к тебе?
Хорошо.

Подумал.

Легче не стало. Всё ещё люблю до беспаметства за твою не поддельную простоту и наивную упёртось в то, чего в сущности не существует: в "проблемы" java с округлением.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587043
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hТеперь сам остановись, помедитируй .... И подумай, что нового ты предложил?
тоже самое:
писать свою функцию, где именно нужно:
умножать->округлять до целого->делить


Еще раз:

Код: plaintext
1.
2.
3.
* The (String) constructor, on the other hand, is perfectly predictable:
* <tt>new BigDecimal(".1")</tt> is <i>exactly</i> equal to .1, as one
* would expect.  Therefore, it is generally recommended that the (String)
* constructor be used in preference to this one.

и

Код: plaintext
Так что, andy_h, могу посоветовать вам преобразовывать double-значения в String-значения.

Может теперь хватит? Проблема округления совершенно стандартна для вещественных чисел, которые нельзя представить в виде X*2^Y. Складывается ощущение, что вы о ней ни разу не слышали.

Предлагаю закрыть топик.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587061
ежемуха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кувалдин РоманПроблема округления совершенно стандартна для вещественных чисел, которые нельзя представить в виде X*2^Y. Складывается ощущение, что вы о ней ни разу не слышали.А что, оно там как-то так хранится?
А я думал, что там хранится длинное целое число плюс число позиций, на которую сдвинуть запятую...

Кувалдин РоманПредлагаю закрыть топик.А мне интересно!
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587077
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ежемуха
> А я думал, что там хранится длинное целое число плюс число
> позиций, на которую сдвинуть запятую...


как вы число 2 сохраните в компьютере? если есть только цифры 0 и 1

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

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


Дорогой коллега, и все участники данного обсуждения.
Целью создания данного топика было выяснить для себя:

andy_h
... каким махером выполнять округление


Если бы цель была узнать как хранятся числа с плавующей точкой или каким образом происходит округление, то уж поверьте, название было бы другим. Хорошо ещё, что про работу CPU и FPU никто не вспомнил, хотя могли.

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

чего-то разработчики не додумали или просто забыли ...


Ладно, всем спасибо, если кого обидел - извините ... Тема исчерпана ...
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587106
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ежемуха Кувалдин РоманПроблема округления совершенно стандартна для вещественных чисел, которые нельзя представить в виде X*2^Y. Складывается ощущение, что вы о ней ни разу не слышали.А что, оно там как-то так хранится?
А я думал, что там хранится длинное целое число плюс число позиций, на которую сдвинуть запятую...


Формат числа с плавающей запятой
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587111
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[OFF]Мельчает программист...[/OFF]
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587122
ежемуха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady ежемуха
> А я думал, что там хранится длинное целое число плюс число
> позиций, на которую сдвинуть запятую...
как вы число 2 сохраните в компьютере? если есть только цифры 0 и 1Ну, как-то вот так:
10
:)
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587126
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а 0.2?
здесь я имею ввиду что не каждое число с дробной частью можно записать
0ми и 1ами

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

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


Ну я как думаю (статью еще не прочел), мы храним отдельно число 2 и отдельно число -1 (тоже в двоичном виде)

2 * 10^ -1

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

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

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

или надо чтобы там не 10 было а 2?...

кажется щас допру...
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587144
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ежемуха Deady ежемуха
> А я думал, что там хранится длинное целое число плюс число
> позиций, на которую сдвинуть запятую...
как вы число 2 сохраните в компьютере? если есть только цифры 0 и 1Ну, как-то вот так:
10
:)

Народ, ещё раз повторюсь. Тема была "Как округлять?" , а не b]"Как хранится?"
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587155
ежемуха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h Народ, ещё раз повторюсь. Тема была "Как округлять?" , а не b]"Как хранится?"

Так если щас выяснится что если компьютер не может успешно отличить

13.5465000000000000000000000000000001 от
13.5464999999999999999999999999999999

то тогда и выяснится, что никак?
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587160
javaScript != java
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andy_hДорогой коллега, и все участники данного обсуждения.
Целью создания данного топика было ...

Вот скажи мне. Если ты знаешь, что было целью данного топика, то почему было сразу не написать об этой цели?

Например, "хочу округлить до Ё-ной цифры после запятой, написав одну строчку кода ХХХ.yyy(my_double_value, Ё). Есть ли ХХХ.yyy в jdk1.5?"

Всё.

Ответ мог быть "да есть, вот: ****" и "нет такого".


Вместо этого ты начинал нести пургу про паскаль с экселем. Когда тебе объяснили, почему эти двое курят в сторонке, ты стал всех куда-то посылать и о чём нераборчиво просить, вероятно, пытаясь показать, кто здесь ГрафМонтеКристо, а кто нет.

Ну к чему оно было надо, а?

Если ты так же пишешь программы, как общаешься на этом форуме, то мне просто жалко того человека, что платит тебе деньги.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587177
ежемуха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я все понял.

(Объяснить не могу:)
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587196
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javaScript != java
...
Вот скажи мне. Если ты знаешь, что было целью данного топика, то почему было сразу не написать об этой цели?
...


Это я и написал в самом-самом начале ...

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


Где здесь про Excel ???

Кусок кода в начале ещё добавил.

Сказали бы: "Не, мужик!!! Это делается не так, а вот так!!!".
Нет же ... сразу в библиотеку посылают, или в "любви" признаются.
А по сути - ничего ...
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587199
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ежемуха
> andy_h Народ, ещё раз повторюсь. Тема была "Как округлять?", а не b]"Как хранится?"

> Так если щас выяснится что если компьютер не может успешно отличить

> 13.5465000000000000000000000000000001 от
> 13.5464999999999999999999999999999999

> то тогда и выяснится, что никак?Тема==Ответить




примерно так и есть, только числа надо аккуратнее подобрать. с этими
может и будет разница.

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

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

Кусок кода в начале ещё добавил.

Сказали бы: "Не, мужик!!! Это делается не так, а вот так!!!".
Нет же ... сразу в библиотеку посылают, или в "любви" признаются.
А по сути - ничего ...

Вот отсюда все начали кипеть: /topic/268869&pg=-1#2421411
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587279
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман
Вот отсюда все начали кипеть: /topic/268869&pg=-1#2421411

А я отсюда /topic/268869&pg=-1#2421093

Я человека спрашиваю по методы округленя в Java, а он меня посылает изучать численные методы (типа умный).

Рома, вот ты любишь всякие алегории, особенно про рыбалку.
Вот ты приходишь и говоришь: "Научи меня ловить рыбу".
А тебе отвечают:"Иди-ка поучись бамбук для удочек выращивать".

Так и здесь ....
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587283
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
...
Это я и написал в самом-самом начале ...
...

Поэтому и жалко твоего работодателя.

Если ты пишешь так, что тебя все понимают не правильно, значит либо все дураки, либо у тебя что-то не так.

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

Почитай, что ты ответил, после того, как тебе показали как это можно сделать.

andy_h
Где здесь про Excel ???

Все ходы записаны.
Вот тут http://www.sql.ru/forum/actualthread.aspx?tid=268869&pg=1#2421715


andy_h
Кусок кода в начале ещё добавил.

Код пишешь ты. Код исполняется всегда правильно. Если в итоге его исполения, ты получил не тот результат что ожидал, то ошибся ты.
Не согласен?

Почему код написанный в начале не делал то, что ты хотел тебе много раз писали.

Это даже больше чем простое "Не, мужик!!! Это делается не так, а вот так!!!".

Но вместо спасибо, ты говоришь совсем другие слова.

andy_h
Нет же ... сразу в библиотеку посылают, или в "любви" признаются.
А по сути - ничего ...

Любовь зла, полюбишь и кого угодно.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587362
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NotGonnaGetUs
...
Почему код написанный в начале не делал то, что ты хотел тебе много раз писали.

Это даже больше чем простое "Не, мужик!!! Это делается не так, а вот так!!!". ...


Ну, если для Вас, молодой человек, диагностика проблемы - это уже её устранение, то ... .
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587412
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hРома, вот ты любишь всякие алегории, особенно про рыбалку.
Вот ты приходишь и говоришь: "Научи меня ловить рыбу".
А тебе отвечают:"Иди-ка поучись бамбук для удочек выращивать".
Так и здесь ....

Гы :-) Если я приду и спрошу "Как ловить рыбу?" - меня пошлют читать многочисленные пособия по рыбалке. И правильно. А вот вопрос в духе "на какого мотыля лучше ловятся карпы в подмосковье?" - это уже более сложный и узкий вопрос, и по нему литературы так просто не найти.

Я всегда пишу свои обработчики округления с заданной мне точностью именно по принципу "умножил-отбросил-разделил", так как проблема округления вещественных чисел мне известна еще со времен C++. Боолее того, это общепринятая практика для численных методов - только так ты можешь гарантировать отсутствие погрешности при округлении.
И я никогда не пользовался BigDecimal до сегодняшнего дня. Тем не менее, мне хватило нескольких минут для того, чтобы заглянуть в исходники класса BigDecimal и увидеть там, откуда растут ноги твоей проблемы. Ты мог сделать те же самые шаги. Но почему-то поленился это сделать, а обратился в форум. Согласись, вопрос явно не из серии узкоспециализированных, и недостоин форума, если для его решения нужно полчаса?

Я собственно к тому, что новое поколение (блин, мне всего 25 лет, а я говорю про другое поколение) зачастую хочет достать готовое решение. Это хорошо с точки зрения "сделал и забыл", но ни разу не правильно с точки зрения профессионального роста.

Мне довелось попрограммировать на ассемблере для ZX Spectrum, в основном методом Научного-Тыка. Это был великолепный опыт, к сожалению, не понадобившийся мне в дальнейшем. Из подобных вещей и складывается умение решать проблемы самостоятельно, а также инженерное мышление и спсобность на нестандартные решения. И то, что новые программисты зачастую не знают ничего, кроме паттернов (да и тех толком не знают) - вот что меня беспокоит по-настоящему. И я так думаю - не одного меня.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587475
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман
И то, что новые программисты зачастую не знают ничего, кроме паттернов (да и тех толком не знают) - вот что меня беспокоит по-настоящему. И я так думаю - не одного меня.

Абсолютно с тобой согласен. Более того я уже ранее говорил, что
в Яве новичок. А на форум обратился только потому, что не нашёл стандартного метода и никто из моих знакомых Джаверов ответа не дал. Написать свой метод - это последний вариант, по крайней мере, когда надо сделать и забыть.
Просто ожидал большего от этого языка. Возьми, например, класс String: сколько методов для работы со строкой. В том же Паскале для тех же целей много приходилось писать ручками. Поэтому, отсутствие roundTo(double d, int digit) - несколько обескуражило, неужели трудно было добавить его в Math?
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587487
andy_h
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин Роман

Гы :-) Если я приду и спрошу "Как ловить рыбу?" - меня пошлют читать многочисленные пособия по рыбалке. И правильно.

И опять-таки, пособие по рыбалке (т.е. по языку Java), а не по ловле мотыля (в данном случае - численные методы)

:-))
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587495
ежемуха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hПоэтому, отсутствие roundTo(double d, int digit) - несколько обескуражило, неужели трудно было добавить его в Math?

Наверно, это испортило бы концепцию. Люди бы стали относиться к отображению технического числа с плавающей точкой двойной длины слишком серьезно. Наверно смысл был в том, чтобы сильнее отделить отображение числа от его хранения, чтобы у людей не возникало соблазна хранить в них серьезные десятичные величины типа денег. А так ясно, что десятичное отображение числа с плавающей точкой - это совсем примерная цифра
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587506
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_hПросто ожидал большего от этого языка. Возьми, например, класс String: сколько методов для работы со строкой. В том же Паскале для тех же целей много приходилось писать ручками. Поэтому, отсутствие roundTo(double d, int digit) - несколько обескуражило, неужели трудно было добавить его в Math?

Ну так и добавили. BigDecimal.ROUND_HALF_UP делает именно то, что тебе надо - если не забывать о косяке округления и делать так, как советуют сами разработчики языка - сначала преобразовать из double в String - это исключит потерю точности.

Вот так надо было написать: new BigDecimal(""+d).setScale(3, BigDecimal.ROUND_HALF_UP));

Да, понимаю, добавили немного не в том месте, где ожидалось... Этому есть свои причины.

Теперь-то можно дискуссию закрывать? Или ты, как и я, не можешь оставить последнее слово за оппонентом? ;-)
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587518
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ежемуха andy_hПоэтому, отсутствие roundTo(double d, int digit) - несколько обескуражило, неужели трудно было добавить его в Math?

Наверно, это испортило бы концепцию. Люди бы стали относиться к отображению технического числа с плавающей точкой двойной длины слишком серьезно. Наверно смысл был в том, чтобы сильнее отделить отображение числа от его хранения, чтобы у людей не возникало соблазна хранить в них серьезные десятичные величины типа денег. А так ясно, что десятичное отображение числа с плавающей точкой - это совсем примерная цифра

Скорее для того, чтобы отделить hardware-dependent значение (double на 32-битных x86, 64-битных AMD и Itanium, маках с прямым порядком байтов etc) от hardware-independent BigDecimal, который по спецификации будет одинаков для всех систем. Например, для меня стало сюрпризом, что int в C++ - это не всегда 32 бита, а в общем-то зависит от разрядности процессора. В таких случаях косяки по переполнению могут полезть в самых неожиданных местах.
...
Рейтинг: 0 / 0
Округление чисел с плавающей запятой!!!!
    #33587594
Евгений Путилин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy_h
))) Умнейший !!! Что ж Вы всё пишите и пишите, а ответа я так пока не получил. Раз Вы так хорошо разбираетесь в этой теме и жёстко цепляетесь к терминологии. Давайте поступим следующим образом:

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

К сожалению компьтер не умеет работать с вещественными числами только с рациональными представленными в виде числа с фиксированной или плавающей точкой. Все это является элементарными знаниями по численным методам. Тебе рекомендуют их читать не потому что нельзя сделать так как ты хочеш, а потому что задаеш не правильные вопросы.

Потом java оптимизированна под процессоры Sun: UltraSPARC. Т.е. работа с числами в некоторых случаях эмулируется, и поведение совершенно отличается от того как будет работать код тогоже паскаля который исполняется в просессорозависимых командах. Не знаю естли для спарков pascal, но на С++ я на них словил очень интересную ошибку в виде bus error.

По поводу RoundTo, с чего ты взял что поведение аналогичной конструкции в java будет аналогично Pascal?
По поводу Excel могу тебе сказать что там число будет хранится в виде фиксированной точки до тех пор пока это будет возможно по этому сравнение не удачно.
...
Рейтинг: 0 / 0
62 сообщений из 62, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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