Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Странные числа на выводе программы! / 9 сообщений из 9, страница 1 из 1
19.05.2016, 14:13
    #39239109
Dmitry56
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Вопрос: почему больше одного знака после точки?

Код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package SolverMini;
public class Obshii {
	public static void main (String []args)
	{
		double i;
	for (i=5; i>=0; i=i-0.1){
		System.out.println(i);
	}
 }	
}



Вывод:

5.0
4.9
4.800000000000001
4.700000000000001
4.600000000000001
4.500000000000002
4.400000000000002
4.3000000000000025
4.200000000000003
4.100000000000003
4.0000000000000036
3.9000000000000035
3.8000000000000034
3.7000000000000033
3.600000000000003
3.500000000000003
3.400000000000003
3.300000000000003
3.200000000000003
3.1000000000000028
3.0000000000000027
2.9000000000000026
2.8000000000000025
2.7000000000000024
2.6000000000000023
2.500000000000002
2.400000000000002
2.300000000000002
2.200000000000002
2.100000000000002
2.0000000000000018
1.9000000000000017
1.8000000000000016
1.7000000000000015
1.6000000000000014
1.5000000000000013
1.4000000000000012
1.3000000000000012
1.200000000000001
1.100000000000001
1.0000000000000009
0.9000000000000009
0.8000000000000009
0.700000000000001
0.600000000000001
0.500000000000001
0.400000000000001
0.30000000000000104
0.20000000000000104
0.10000000000000103
1.0269562977782698E-15
...
Рейтинг: 0 / 0
19.05.2016, 14:18
    #39239117
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Dmitry56 Вопрос: почему больше одного знака после точки?
Потому что многие десятичные дроби не имеют конечного представления в двоичном виде.
Ищите вводные статьи о том как дроби хранятся в двоичной системе.
http://vestikinc.narod.ru/AB/ni_bin.htm
http://school.dtv.su/sistemyi-perevod-drobnyih-chisel/
...
Рейтинг: 0 / 0
19.05.2016, 14:20
    #39239121
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Dmitry56,

у вас к гуглу доступ закрыли? :)
В общем виде ответ на поставленный выше вопрос будет звучать примерно так: «Подобные ошибки связанны с внутренним двоичным (binary) представлением чисел. Подобно тому, как в десятичной системе нельзя точно представить результат деления 1/3, так и в двоичной системе невозможно точно представить 1/10. Если вам нужно исключить ошибки округления, следует использовать класс BigDecimal».
https://habrahabr.ru/post/219595/
и еще много подобных ссылок можно найти там же
...
Рейтинг: 0 / 0
19.05.2016, 14:22
    #39239124
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Кстати с BigDecimal тоже не все так просто, например если из 2.00 вычесть 1.1, то мы не получим 0.9, а получим 0.89999999... и еще кучу цифер
...
Рейтинг: 0 / 0
19.05.2016, 14:27
    #39239130
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
NixicКстати с BigDecimal тоже не все так просто, например если из 2.00 вычесть 1.1, то мы не получим 0.9, а получим 0.89999999... и еще кучу циферрешается округлением
...
Рейтинг: 0 / 0
19.05.2016, 14:29
    #39239132
vsl
vsl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
UsmanNixicКстати с BigDecimal тоже не все так просто, например если из 2.00 вычесть 1.1, то мы не получим 0.9, а получим 0.89999999... и еще кучу циферрешается округлением
решается правильным способом создания BigDecimal
Код: java
1.
2.
3.
4.
bsh % print(new BigDecimal(2.0).subtract(new BigDecimal(1.1)));
0.899999999999999911182158029987476766109466552734375
bsh % print(new BigDecimal("2.0").subtract(new BigDecimal("1.1")));
0.9
...
Рейтинг: 0 / 0
19.05.2016, 14:48
    #39239153
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
vslUsmanпропущено...
решается округлением
решается правильным способом создания BigDecimal
Код: java
1.
2.
3.
4.
bsh % print(new BigDecimal(2.0).subtract(new BigDecimal(1.1)));
0.899999999999999911182158029987476766109466552734375
bsh % print(new BigDecimal("2.0").subtract(new BigDecimal("1.1")));
0.9

+128
Да, есть такое, когда проблемы double переносятся в BigDecimal
...
Рейтинг: 0 / 0
19.05.2016, 14:51
    #39239156
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Usmanкогда проблемы double переносятся в BigDecimal Напомнило 19016384
...
Рейтинг: 0 / 0
19.05.2016, 15:52
    #39239259
Dmitry56
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странные числа на выводе программы!
Понял, спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Странные числа на выводе программы! / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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