powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
25 сообщений из 62, страница 2 из 3
Округление чисел с плавающей запятой!!!!
    #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
25 сообщений из 62, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Округление чисел с плавающей запятой!!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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