|
|
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Доброго дня господа Работаю с финансовой задачей, имею проблему с типом Double 1.1*1.1 = 1.2100000000000002 ???????? Суть проблемы в целом ясна, не ясно как попроще решить Прошу Вашего совета Например так, но BigDecimal не дает нужной точности Код: java 1. 2. Код: java 1. 2. 3. 4. 5. 6. Заранее благодарен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 19:18 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Не очень понял, что Вам нужно, но может быть поможет: Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 19:34 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
дабл и финансы - несовместимые вещи. и где это там у вас что за такая фин.задача, если точности бигдеца не хватает??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 20:00 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_X Код: java 1. Очевидно, что проблемы "double" перенеслись в BigDecimal. А если сделать так: Код: java 1. 2. то все ок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 20:26 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
лол. еще проще. вообще так нельзя создавать бигдецы из дабла. а в первом сообщении вообще в бигдец вталкивается уже кривое значение выражения. туда надо вкидывать или стринг (создавая значение). или так: автор BigDecimal a = BigDecimal.valueOf(1.1); BigDecimal b = BigDecimal.valueOf(1.1); System.out.println(a.multiply(b).toString()); но тут вот тоже кстати, некоторые почему-то не рекомендуют ТАК создавать бигдецы. хотя.. я создавал и софт писал и расхождений с той же 1с-кой в результатах не наблюдалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 22:09 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Тема - старый боян. Дробная часть - в double/float не кодируется а апроксимируется. Тоесть ее величина - приближенная. Есть частные случаи когда она точно равна. Это дроби вида 1/2,1/4, 1/8 и производные суммы от них. Количество членов этого ряда ограничено. Для float оно еще меньше. Тоесть можно сказать что floating-point типы сжимают любое вещественное число в некий enumeration из известного набора констант. А все прочие вещественные числа будут закодированы с потерями. Как вы будете отрабатывать эти потери - это дело ваше. Это дело прикладное. И оно не касается самого типа double. Он уже свою задачу выполнил. Это ваша личная ответственность как знатока арифметики и десятичной бухгалтерской системы. А лучше действительно кодируйте в BigDecimal. Если сильно интересно что это за магия констант - курите Код: java 1. 2. (Это что-то вроде итератора по оси вещественных чисел.) Код: java 1. 2. Это служебные native функции которые позволяют получить сырое представление double в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 01:39 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
mayton, Да это по сути ничего не меняет (применение другого типа), суть в том что я не знаю когда именно идет искажение в ЛЮБОМ типе, а когда это корректная величина. Т.е. насколько и как округлять Пример 8297.69/12 = 691.474166666667 - ИСТИНА 936.3/12 = 78.025 - ИСТИНА Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Результат 691.4741666666667 - дробная часть корректна 691.47 691.47 78.024 99999999999 - эти девятки лишние число делиться нацело 78.02 78.03 BigDecimal 691.4741666666667470053653232753276824951171875 78.0249999999999914734871708787977695465087890625 - опять лишние девятки А если округлять сначала до третьего, потом до второго - все равно имеем ошибку, но другого типа. Что скажите ? Спасибо за уделенное время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 11:39 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_X, ты маешься фигней. забудь о даблах. ты утархаешься с ними когда у тебя пойдут более-менее каскадные вычисления какой-нибудь финансовой фигни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 15:02 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
я тоже в свое время пытался с этими раундами изобрести сильвербулет для дабла. не вышло. ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 15:03 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
natanabrahamjrHOME_X, ты маешься фигней. забудь о даблах. ты утархаешься с ними когда у тебя пойдут более-менее каскадные вычисления какой-нибудь финансовой фигни. У меня ИДУТ каскадные вычисления финансовой фигни..... отсюда и спрашиваю, чем можно адекватно заменить ? (BigDecimal - аналогичен) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 16:45 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_XПример 8297.69/12 = 691.474166666667 - ИСТИНА 936.3/12 = 78.025 - ИСТИНА Что означает этот модульный тест? Почему вы пишете о какой-то истине. Вот в Lisp результат другой. Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 17:16 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_XА если округлять сначала до третьего, потом до второго - все равно имеем ошибку, но другого типа. Что скажите ? Скажу что это неверная постановка задачи. Само по себе понятие округления безсмысленно по отношению к double? Double принципиально не округляется. Округляется его строковое десятичное представление. А если вы оперируете с этим предсавлением ( BCD, BigDecimal, symbolic, money ) арифметикой то зачем вам double? Вы уже задействовали механизмы на порядки более тяжелые чем double. Улавливаете? Если вам так лень использовать синтаксис java в отношении BigDecimal - посмотрите в сторону Scala или Groovy. Возможно там синтаксис более удобен для бухгалтерии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 17:27 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
maytonЧто означает этот модульный тест? Это просто пример - не обращайте внимания... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 19:25 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
maytonЕсли вам так лень использовать синтаксис java в отношении BigDecimal - посмотрите в сторону Scala или Groovy. Мне необходимо просчитать порядка 50-70 полей объекта Тип расчета - финасово-бухгалтерский. Операции - математика средней школы (+ - / * ) Размерность полей 18.2, 18.8 Тип Double взят как базовый, предполагал что он максимально прост без конструкторов и прочих излишеств BigDecimal - дает те же погрешности Вы это видели из примеров. Scala или Groovy - зачем так сложно ? В Java нет простого математического типа ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 19:45 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Хоум, ты понимаешь, что когда ты делаешь ТАК: ava.math.BigDecimal r = new java.math.BigDecimal( 936.30/12.0); это НЕ БИГ ДЕЦИМАЛ. ты в дабле делаешь это уродское число а потом передаешь его как есть в бигдец. а потом говоришь бигдец не работает.. )) прочитай ты мануал наконец. или стаковерфлоу. вот тебе твой код и мой код сравни оба значения и удивись: Код: java 1. 2. 3. 4. если ты тут не видишь разницы - то прочти наконец хотяб книжку ява-хеад-ферст. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 20:01 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
natanabrahamjr, Понял Вас - спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 20:12 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_X, я прошу прощения если был сугубо резок. но на самом деле, вы наступаете на грабли, на которые уже много раз до вас наступали. посему не изобретайте велосипед. бигдец - это хрошая вещь, там и округление можете подключать и обрезку и т.п. при правильно использвании с той же адинэской расхождений не будет. а проблема округления это в принципе, такая вещь, с которой все бухи сталкиваются. делайте просто как они хотят и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 20:35 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_XВ Java нет простого математического типа ? Да. В Java действительно нет простого математического (примитивного типа). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 21:18 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
mayton, ....а еще в ней нет переопределения операторов... хотя... в джейэспи ты без проблем можешь писать бигдец1+бигдец2 - бигдец3. и оно даже работать будет нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 21:22 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:14 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
что нет? будет. и работает. и будет и работает. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:25 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
mayton, natanabrahamjr Очень благодарен за ответы господа ! P.S. maytonДа. В Java действительно нет простого математического (примитивного типа). Блин - траханина на пустом месте..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:34 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
HOME_X, на первый взгляд да. а на второй и третий - со временем привыкните преобразовывать математические действия в последовательность вида: a.multiply(b).divide(c).add(d.substract(e)).setScale(2,BigDecimal.ROUND_HALF_UP).toString(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:43 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Мне кажется, в ситуациях 1.1 * 1.1 проблема в постановке задачи 1) BigDecimal нужен, когда мы оперируем деньгами - складываем, вычитаем и так далее если это 1 рубль 10 коп. x 1.1 кило картошки = то ответ 1 рубль 21 коп. и потери точности при BigDecimal взяться не откуда. 2 знака после запятой и не е.... IMHO 2) если проблема, что данные глобально отличаются от данных суммированных по строкам: купили 100 кг. картошки по 1.10, а продаем в пачках по 10 грамм по себестоимости ( 1р10к/0.01=0,011=1 коп и 0.1 коп потерялась) То эта проблема давно решена в бухгалтерии, есть отдельные счета для расхождений, куда это расхождение и должно быть записано. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 19:12 |
|
||
|
Тип Double - 1.1*1.1 = 1.2100000000000002
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev1) BigDecimal нужен, когда мы оперируем деньгами - складываем, вычитаем и так далее Оперируем деньгами, BigDecimal мне не нравиться - сложен в использовани a.multiply(b).divide(c).add(d.substract(e)).setScale(2,BigDecimal.ROUND_HALF_UP).toString() слишком непонятно и нечитабельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2016, 19:34 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39295142&tid=2123728]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
142ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 447ms |

| 0 / 0 |
