powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Арифметика Джавы. WTF?
25 сообщений из 53, страница 1 из 3
Арифметика Джавы. WTF?
    #38320609
junior_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Итак, пару примеров кода.

Код: java
1.
2.
double x = 0.3 + 0.97;
System.out.println(x); // Выводит 1.27, ОК


Код: java
1.
2.
double x = 31.3 + 0.97;
System.out.println(x); // Выводит 32.27, ОК


Код: java
1.
2.
double x = 32.3 + 0.97; 
System.out.println(x); // Выводит 33.269999999999996,  ВТФ???


Код: java
1.
2.
double x = 49.3 + 12.97; 
System.out.println(x); // Выводит 62.269999999999996,  ВТФ???



Объясните кто-нибудь почему так. Проверил в сишарпе, там все нормально.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320626
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior_devОбъясните кто-нибудь почему такМагия данных.
Читать про приближённые вычисления вообще и про устройство компьютерных вещественных чисел - в частности.
Если читать лень, то просто запомните, что "десять в отрицательной степени" не может быть представлено конечной двоичной дробью.Проверил в сишарпе, там все нормально."Смешно".
Хотите округления - укажите в строке формата, скока точно граммов... знаков вам нужно.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320628
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320634
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, junior_dev!

> double x = 31.3 + 0.97;
> System.out.println(x); // Выводит 32.27, ОК
>
>
> double x = 32.3 + 0.97;
> System.out.println(x); // Выводит 33.269999999999996, ВТФ???

Логично, во втором случае сумма больше 2^5, поэтому на "хвост" после
запятой остаётся меньше места и ошибка округления (0.97 не представимо в
виде конечной двоичной дроби) вылезает в 15й знак.

То, что в java по-умолчанию 15 знаков после запятой, а в C# меньше- сути
не меняет.

--
Алексей
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320691
junior_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ясно, всем спасибо.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320725
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraТо, что в java по-умолчанию 15 знаков после запятой, а в C# меньше- сути
не меняет.

Количество знаков после запятой тут не при чем. Double тип один и тот же и там и там.
В C# вывод в консоль реализует округление. В Java - нет.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320730
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior_dev, выведи double в двоичном представлении. Готов спорить что результат в C# и Java
будет одинаковым.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320806
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320818
milton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
junior_dev,

Спасибо за вопрос.
Сразу вспомнил своих бывших коллег из других отделов, у которых в документах Excel с формулами внезапно появлялись расхождения в 1*10e-9.
Для экономистов-юристов это вообще шок.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38320836
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особенно интересно когда номера счетов пишут в формате double. Еще смешнее...
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38322894
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле ещё смешнее, что в Java, языке, который теперь служит в основном для программирования безнес-логики всяческих приложений, до сих пор нет встроенной точной десятичной арифметики, и нет соответствующего типа данных.
(встроенного).
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38322984
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдо сих пор нет встроенной точной десятичной арифметики, и нет соответствующего типа данных.
(встроенного).1. А где есть?
2. Что ещё предложите встроить?
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38322999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C# есть. А в Java нет примитивного типа для работы с фин.арифметикой. И это действительно проблема.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323115
JavaSpringFrameworkHibernateGWT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторC# есть. А в Java нет примитивного типа для работы с фин.арифметикой. И это действительно проблема.
java.lang.BigDecimal не подходит что-ли?
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323116
JavaSpringFrameworkHibernateGWT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonC# есть. А в Java нет примитивного типа для работы с фин.арифметикой. И это действительно проблема.
То есть java.math.BigDecimal, сорри http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323119
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще топикстартеру можно загуглить ieee-754
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavaSpringFrameworkHibernateGWTавторC# есть. А в Java нет примитивного типа для работы с фин.арифметикой. И это действительно проблема.
java.lang.BigDecimal не подходит что-ли?
А ты пробовал когда-нибудь закодить на ней какую-то простую расчётную формулу? Проверить что-то.
Посчитать процент и сложить. А потом сравнить с другим языком в котором есть хотя-бы реализация
инфиксных операций.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323148
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
да вам не длинная арифметика то нужна, а перегрузка операторов ...
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323656
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Basil A. Sidorov!

> 1. А где есть?

Ada :)
Соответственно pl/sql.

> 2. Что ещё предложите встроить?

По хорошему надо было сделать определение операций.
Давно было показано, зачем это надо.
Но Гослинг, как чукча- не читатель был...

--
Алексей
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38323747
gr_vl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а так

BigDecimal x = new BigDecimal(0.3 + 0.97,new MathContext(4, RoundingMode.HALF_EVEN));
System.out.println(x); // Выводит 1.27, ОК

x = new BigDecimal(31.3 + 0.97,new MathContext(4, RoundingMode.HALF_EVEN));;
System.out.println(x); // Выводит 32.27, ОК

x = new BigDecimal(32.3 + 0.97,new MathContext(4, RoundingMode.HALF_EVEN));;
System.out.println(x); // Выводит 33.27

x = new BigDecimal(49.3 + 12.97,new MathContext(4, RoundingMode.HALF_EVEN));;
System.out.println(x); // Выводит 62.27
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38324072
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirmayton,
да вам не длинная арифметика то нужна, а перегрузка операторов ...
Здесь - комплексная проблема. И попытка использовать double в операциях
с деньгами - это отчасти плата за неудобство BigDecimal. Я много сжёг своей кармы
в попытках исправить продакшен код где эти операции имели место. Но
кода много - а я один.

Даст бог в Scala концепция другая.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38324416
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗдесь - комплексная проблемаА ещё бизнесу важен кадровый вопрос, а кадрам важны даты и интервалы между ними.
Давайте встроим календарь и интервальную арифметику прямо в язык.
Потом вспомним, что на компьютере у нас часы и реализуем два варианта - с учётом часовых поясов и без.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38324492
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
99% задач с датами покрываются простейшей арифметикой
наподобие Oracle Date. Арифметические операции с датой
трактуются как сложение и вычитание дробного числа суток.

Пример

Код: plsql
1.
select sysdate-1 from dual


возвращает вчерашний день. Разумеется функции работают
в контексте локали.

И разумеется код - самодостаточный.

Некто Антон Кекс в своих видео-посланиях цивилизации джавистам
справедливо обращает внимание на слёзную просьбу бизнес-аналитиков -
как можно больше логики переносить в БД . И думается на то
есть основания. И они лежат не в плоскости DBMS/Java а просто
исходят из объективной проблемы. Бизнес-расчёты в Java-коде
завуалированы. Код "шумит" лишними сущностями и понять ЧТО
собственно мы вычисляем - довольно затруднительно. Собственно
Java код не годится для обратного инжинеринга бизнес формулы.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38324683
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, В 18:00 местного времени владивостокский офис оформил приказ о приёме на работу "с сегодняшнего числа".
Какую дату увидит московский офис завтра? Сегодня он уже спит.
Ну или стандартная задача из ТК по расчёту отпускных - выходные учитываются, а праздничные - нет.

P.S. Я не против того, что мы живём в мире всё возрастающего комфорта - мне это очень даже нравится.
Я против того, чтобы объявлять недостаток комфорта глобальным дефектом, требующим исправления.
...
Рейтинг: 0 / 0
Арифметика Джавы. WTF?
    #38324695
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Давай развивать твою мысль. Через 300 лет нам понадобиться несколько дополнительных
сущностей в локализации. Нам надо будет указывать номер планеты в солнечной системе.
Номер галлактики. Номер скопления или кластера и учитывать прочие забавные эффекты
физики света и времени о которых писал старый волосатый и усатый немец.

Поэтому давай не будем разбивать себе лоб об пол решая ОБЫЧНЫЕ каждодневные задачи.
Про локализацию я упомянул. Я живу и работаю в Украине и поэтому для всех местных
проектов часовой пояс - UTC+2 и даст бог нет пока проблем со временем во Владивостоке.

Тоже самое с decimal и java.lang.BigDecimal. Это разный подход. Я не буду спорить со столпами
ООП на тему концептуальности, нужности и ненужности примитивных типов и перегрузки
операций. Но я знаю что программист как человек устроен так что он ВСЕГДА упрощает
себе задачу. Он всегда старается писать компактно и лаконично. Ему иногда мешают
очень шумные маркетинговые технологии но я верю в то что здравый смысл восторжествует.

Дайте в Java примитивный тип decimal и все будут рукоплескать. Унылое бормотание теоретиков на тему
того что дескыть неконцептульаненько и некрасивинько никого не будут волновать.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Арифметика Джавы. WTF?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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