powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / int ->double->int - потеря точности.
25 сообщений из 46, страница 1 из 2
int ->double->int - потеря точности.
    #39199926
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
3.
int a=1;
double b = a;
int c = (int) b;



Есть ли гарантия, что для любого входного числа(в данном случае 1) c будет равно a ?
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199946
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,
а может для начала ознакомиться с основами информатики?
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199965
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
for (int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a++) {
    double b = a;
    int c = (int) b;
    if (c != a) {
        System.out.println("a != c");
        break;
    }
}
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199969
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanquestioner,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
for (int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a++) {
    double b = a;
    int c = (int) b;
    if (c != a) {
        System.out.println("a != c");
        break;
    }
}



А! Огонь! Хоть бы вывел a, что ли :D
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199973
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usmanquestioner,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
for (int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a++) {
    double b = a;
    int c = (int) b;
    if (c != a) {
        System.out.println("a != c");
        break;
    }
}



за пару минут выполнения пока в консоли пустота)
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199974
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадяquestioner,
а может для начала ознакомиться с основами информатики?

Молодец, самоутвердился.

Есть что по делу сказать7
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199980
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerвадяquestioner,
а может для начала ознакомиться с основами информатики?

Молодец, самоутвердился.

Есть что по делу сказать7
Вадя совершенно прав.
https://ru.wikipedia.org/wiki/Число_двойной_точности

Мантиса = 52 бита
Порядок = 11 бит

int = 32 бита

Явно в мантису весь int "влезет" и еще место останется. Хотя и вопрос и код выглядят "странно". Я бы так лишний раз не делал.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199994
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

ну ведь когда мы делаем

Код: java
1.
double d = 1;



то это ж будет не совсем один. я думал, что либо чуть больше, либо чуть меньше.

Если чуть больше, то при отбрасывании нулей - всё ок.

Если будет чуть меньше, то ведь должно скаститься к нулю
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39199998
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questionerну ведь когда мы делаем

Код: java
1.
double d = 1;



то это ж будет не совсем один. я думал, что либо чуть больше, либо чуть меньше.

Потому тебе и советуют обратиться к основам- чтобы узнать (и понять причину), что 1 и 0.5 будут точными, а 0.2 - нет :D
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200006
Фотография JonnySKS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman
Код: java
1.
(int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a++)


Превышение MAX_INT. Бесконечный цикл.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200014
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JonnySKSUsman
Код: java
1.
(int a = Integer.MIN_VALUE; a <= Integer.MAX_VALUE; a++)



Превышение MAX_INT. Бесконечный цикл.Точно !
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200196
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner
Код: java
1.
2.
3.
int a=1;
double b = a;
int c = (int) b;


Есть ли гарантия, что для любого входного числа(в данном случае 1) c будет равно a ?

Сходу замечание, что сама по себе постановка вопроса как "равно"
не применима к double. Во всех технических ВТУЗ-ах студентам втолковывают
весь первый семестр что double, extended, float
НЕЛЬЗЯ сравнивать на равенство. Его можно брать на попадание в
ОКРЕСТНОСТЬ эпсилон либо жестко гнать по БОЛЬШЕ/МЕНЬШЕ

Но вернёмся к котам.

Для диапазона int можно считать что кастинг отработает успешно.
Но само по себе толкование вещественного числа весьма шИроко
и несёт больше смыслов чем int. Например double может фиксировать
бесконечности обоих знаков и результат типа "неопределённость"
кооторый вроде бы константа но не есть число и может клинить
кумулятивные вычисления.

По поводу точности. Покури следующий метод

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#ulp-double-
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200241
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТС, используй бигдецимал. дабл вообще сами по себе неточные. )) мне по наследству достался бухпроект где валюты хранились в даблах. это просто жесть. делишь 10 на 4 а в ответ: 2.500000000000000000000000001 или 2.4999999999999999991 в итоге приходится в даблах только хранить а для каких то действий делать конверт. хотя это вроде тоже не рекомендуется. но работает вроде без глюков.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200423
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2...
+
Сам такое наблюдал не раз.

maytonЕсть ли гарантия, что для любого входного числа(в данном случае 1) c будет равно a ?

Сходу замечание, что сама по себе постановка вопроса как "равно"
не применима к double. Во всех технических ВТУЗ-ах студентам втолковывают
весь первый семестр что double, extended, float
НЕЛЬЗЯ сравнивать на равенство. Его можно брать на попадание в
ОКРЕСТНОСТЬ эпсилон либо жестко гнать по БОЛЬШЕ/МЕНЬШЕ
[/quot]
И даже если это небольшое "лукавство", лучше этому правилу следовать.

Полностью с преподавателями согласен. Иначе в реальной жизни получается жесть как у lor2.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200424
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2...
+
Сам такое наблюдал не раз.

maytonСходу замечание, что сама по себе постановка вопроса как "равно"
не применима к double. Во всех технических ВТУЗ-ах студентам втолковывают
весь первый семестр что double, extended, float
НЕЛЬЗЯ сравнивать на равенство. Его можно брать на попадание в
ОКРЕСТНОСТЬ эпсилон либо жестко гнать по БОЛЬШЕ/МЕНЬШЕ

И даже если это небольшое "лукавство", лучше этому правилу следовать.

Полностью с преподавателями согласен. Иначе в реальной жизни получается жесть как у lor2.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200463
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lor2,

Отсюда и вопрос то возник.
может вроде как больше и меньше быть. немножко.
Но на практике для целых чисел добиться этого не удалось.

Есть этому теоретическое объяснение или я просто плохо пробовал?


P.S. в apache commons либе увидел код, в котором double приводят к int
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200473
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Интересная статья: https://habrahabr.ru/company/xakep/blog/257897/
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200480
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner...Есть этому теоретическое объяснение или я просто плохо пробовал?...

Точность мантисы (52 бита) в double намного больше, чем размерность int (32)
И то и то в существующей реализации работает по степеням 2'ки.

Т.ч. потеря точности на целых числах взяться не откуда.

Но в _существующей_ реализации и _только_ в твоей постановке вопроса (сферический конь в вакууме).

В реальной жизни (если конь не такой сферический и/или вакуум не полный) - mayton и преподаватели полностью правы.

1) Long в double уже не влезет.

2) При работе с дробями. В арифметики с фиксированной точкой, скорее всего понадобятся степени - 10-ки, а в double - степени 2-ки. Можно нарваться на кучу приятных моментов.

3) При арифметических операциях. Правила "округления" для int и double будут полностью разные.

4) Смысла заменять int на double ... с ходу придумать сложно:
3.1. int занимает меньше места
3.2. int должен работать намного быстрее

Т.ч. практический смысл твоего вопроса, применительно к _реальной_ жизни, не понятен.

P.S. в apache commons либе увидел код, в котором double приводят к int
1) Показывай код и место, где его применили.
2) На заборе написано "х#й" - а там дрова лежат! И что?
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200490
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
Ну и степень 2 для представления мантисы/порядка тоже, в общем, не гарантирована.

1) Например float в IBM 360 - работал по степени 16
2) Беглым поиском по I-net находится, что в Python'е бывает " decimal floating point arithmetic"

Т.ч. задаваясь настолько глубокими "философскими" вопросами - в код их тащить не стоит. IMHO & AFAIK
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200499
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я вот одного не понимаю чо неужели за столько лет не могли создать нормальный адекватный примитив чтоб подобного секса не было? ведь даже с бигдецималом относительно длинная цепочка элементарных математических действий по внешнему виду превращается в нечто монструозное для вяких фриков-красноглазиков.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200521
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я вот одного не понимаю чо неужели за столько лет не могли создать нормальный адекватный примитив.....
За столько лет, про него просто забыли )))

1. Дремучая древность техники. Проблем нет:
IBM / 360 - содержит аппаратную поддержку BCD типа. PL/1 разумеется, про него все знает:

"...The data type of arithmetic values is expressed using the following attributes:
FIXED BINARY(p) and FIXED DECIMAL(p,q) for fixed-point data
FLOAT BINARY(p) and FLOAT DECIMAL(p) for floating-point data
..."

2. Юность )))
Intel 8086 - содержал минимальный набор команд для поддержки BCD (нормализация данных)

Basic, Pascal, Logo - кто же на них серьезно обращал внимание))) это так, для школьников/студентов
C - это вообще язык для написания переносимой ОС. Про бухгалтерию и BCD возможно никто и не думал.

Серьезные БД - Oracle. Проблем нет. Number
БД для ПК - dBase. Проблем нет. Number = Fixed point арифметика. Про float (в файле на диске) даже и не знает

3. Современность

Студенты с горящими глазами и ООП на плакатах - нафиг им бухгалтерия и BCD ? Им бы космические корабли запускать и виртуальные методы виртуалить

PostgreSQL и прочие современные БД - как же без любимого Pascal'евского float в БД ?
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200529
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2ведь даже с бигдецималом относительно длинная цепочка элементарных математических действий по внешнему виду превращается в нечто монструозное для вяких фриков-красноглазиков.К сожалению нет перегрузки операторов.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200560
lor2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и еще тупой вопрос всё руки никак не дойдут попробовать )) я делаю на спринг жсп форм:форм, и забираю какой то объект, в котором есть поля бигдецимал )) они с хтмл формы нормально заберутся и сразу сконвертятся в бигдецимал или надо будет долбаный форматтер городить?
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200563
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегрузка операторов проблем с "убожестью" языка не решает, а только усугубляет.

Если 5 + 10 * 4 - 3 будет выливаться в неявные:

new BigDecimal( new BigDecimal( new BigDecimal( 5 ) + new BigDecimal( new BigDecimal( 10 ) * new BigDecimal( 4 ) ) ) - new BigDecimal( 3 ) )

это назвать "красивым решением" IMHO никак нельзя.

Если со строками элегантного решения все равно нет (память под строку все равно нужно выделять), то потеря скорости на иммутабле объектах для BCD (вся бухгалтерия) или при работе с датами (куча задач) - выглядит мягко говоря... не очень элегантно

Сейчас нужно обсчитывать данные с датами. Перешел на joda date, т.к. проводить вычислений с immutable объектами - крайне расточительно.
...
Рейтинг: 0 / 0
int ->double->int - потеря точности.
    #39200599
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lor2я вот одного не понимаю чо неужели за столько лет не могли создать нормальный адекватный примитив чтоб подобного секса не было? ведь даже с бигдецималом относительно длинная цепочка элементарных математических действий по внешнему виду превращается в нечто монструозное для вяких фриков-красноглазиков.
В твоих словах скользит боль и злость и обида новичка который еще в чем-то не разобрался.

BigDecimal имеет перегруженные операции в языках Groovy, Kotlin. Если действительно
так припекло с бухгалтерией то можно часть расчетов описать на другом ЯП а потом заюзать
в Java (как это сделать практически я щас не буду обсуждать но впринципе возможно).

Тость пути устранения твоей злобы - существуют.

Почему изначально не было создано примитивного типа такого как decimal в C# - это
сложный вопрос. Не на одну страницу. Возможно Гослинг считал что для программирования
мобилок и пультов ДУ для телевизоров (ага это был 1996 год) нет смысла усложнять
язык и вводить туда примитивы которые сложно будет поддержать железом. Поддержать
алгебраический INT32 - легко почти на любом железе. А ломать language compatibility
впоследствии уже никто не хотел. Поэтому класс остался классом а примитив - примитивом.
Туда-же лесом ушли вопросы атомарностей, синхронизаций и прочего что инженеры
считали целесообразным.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / int ->double->int - потеря точности.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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