|
|
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Добрый день, господа. Пишу программу. Получая исходные данные в виде суммы кредита, рассчитывает сумму ануитетного платежа. Код: Код: 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. ======= в результате получаем: Средний ежемесячный платёж будет составлять NaN американских рублей! всего придеццо отдать NaN ! Переплата составит NaN ! Почему NaN???!! Где упустил? Вторые сутки голову ломаю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 17:53:01 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
В последней итерации цикла будет деление на нуль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 18:09:31 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
На ноль делить нельзя))) Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 18:11:56 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Спасибо за помощь!!!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 18:36:39 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Все финансовые расчеты в Java надо делать строжайше в BigDecimal! BigDecimal для них и предназначен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 20:50:23 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Да ладно, этож курсовая или лаба :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 22:24:22 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
VurnВсе финансовые расчеты в Java надо делать строжайше в BigDecimal! BigDecimal для них и предназначен. Излишне категорично, поэтому ерунда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 22:47:20 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Софтверный проктолог VurnВсе финансовые расчеты в Java надо делать строжайше в BigDecimal! BigDecimal для них и предназначен. Излишне категорично, поэтому ерунда. Вывод сделан на основе проигранного судебного дела, вызванного ошибочными расчетами сумм из-за неточности float & double/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2007, 23:27:27 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Vurn Вывод сделан на основе проигранного судебного дела, вызванного ошибочными расчетами сумм из-за неточности float & double/ Мне было бы очень интересно взглянуть на финансовый расчет, в котором не хватает 17 цифр после запятой. Хотя бы порядок чисел и проводимые операции, вас не затруднит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 01:01:47 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Простите, 15 цифр. Но не суть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 01:02:34 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
VurnВывод сделан на основе проигранного судебного дела, вызванного ошибочными расчетами сумм из-за неточности float & double/о! а чо - на зоне инет уже провели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 01:24:05 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Софтверный проктологПростите, 15 цифр. Но не суть. Бюджет сша в йенах. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 06:45:52 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Проблема не в порядке величин, а в том что десятые доли не точно представляются в двоичной системе счисления. И в зависимости от уже порядка точность представления разные и округление после различных операций может осуществляться в разные стороны. Еще одна проблема связана со сравнением величин с плавающей точкой. В любом учебнике по программированию Вы найдете фразу о том что крайне нежелательно использовать == для сравнения чисел с плавающей запятой. Для сравнения таких чисел сравнивают абсолютную величину их разности с константой или берут отношение абсолютной разности и наибольшего по модулю числа и сравнивают с константой. Не выполняются некоторые аксиомы, например: a*c + b*c == (a+b)*c, выполняется не всегда, почти никогда. BigDecimal - быстрый и удобный, смысла в использовании double НЕТ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 06:58:06 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirПроблема не в порядке величин, а в том что десятые доли не точно представляются в двоичной системе счисления. И в зависимости от уже порядка точность представления разные и округление после различных операций может осуществляться в разные стороны. Еще одна проблема связана со сравнением величин с плавающей точкой. В любом учебнике по программированию Вы найдете фразу о том что крайне нежелательно использовать == для сравнения чисел с плавающей запятой. Для сравнения таких чисел сравнивают абсолютную величину их разности с константой или берут отношение абсолютной разности и наибольшего по модулю числа и сравнивают с константой. Не выполняются некоторые аксиомы, например: a*c + b*c == (a+b)*c, выполняется не всегда, почти никогда. BigDecimal - быстрый и удобный, смысла в использовании double НЕТ. А зачем это делать? Зачем точно сравнивать числа? Если уж когда и приходилось высчитывать циферки — алгоритм был прост: зачитать данные из СУБД, провести над ними ряд операций (сложений, умножений, делений, вычитаний) и запихнуть обратно в СУБД. При том, что не видел в своей жизни БД, где бы для хранения вещественных чисел использовались поля в таблицах размерности больше чем что-то в районе number(24,10). У меня такое ощущения, что я чего-то не понимаю :) Просто, наверное, не те циферки считаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 10:11:10 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Софтверный проктолог А зачем это делать? Зачем точно сравнивать числа? C нулем сравнивать иногда приходится. При том, что не видел в своей жизни БД, где бы для хранения вещественных чисел использовались поля в таблицах размерности больше чем что-то в районе number(24,10). Тип money в MS SQL Server 8 байт. Не больше чем тип float в той же СУБД (double в Java). У меня такое ощущения, что я чего-то не понимаю :) Просто, наверное, не те циферки считаю :) Я рад, что Вам никогда не приходилось сталкиваться с проблемами с потерей точности. Но я то всю время учебы в Универе разрабатывал расчетные программы и все эти проблемы "пощупал руками". И еще, тип BigDecimal дает абсолютную свободу для округления, хочешь вверх, хочешь вниз, хочешь наискосок :) . Еще можно поспорить о скорости работы с этими типами. С одной стороны целочисленные вычисления выполняются быстрее и целочисленных операций за единицу времени может быть выполнено больше. Кроме того, в Power 6 включили операции для работы с десятичной дробью. С другой стороны, в современных процессорах вычисления с плавающей запятой так же выполняются достаточно быстро, а тип BigDecimal вынуждает тратить процессорное время и память на накладные расходы. Поэтому я затрудняюсь ответить работа с каким из типов быстрее. Нужны тесты. Но думаю, что отличия не большие. Во всяком случае у меня проблем с производительностью вызванных использованием типа BigDecimal не было. К чему я? Так вот, чем рисковать потерять точность, а потом искать куда делась копейка, лучше сразу использовать BigDecimal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:17:47 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirТип money в MS SQL Server 8 байт. Не больше чем тип float в той же СУБД (double в Java). Я не пользуюсь MS SQL. Я никогда не пользую в СУБД такие типы данных как money или float — только number с ручным указанием точности. На моей практике встречались number(24,10), numeric(18,8) и numeric(20,5) — в каждом отдельном случае это всех устраивало. В некоторых расчетах всегда округляют промежуточные суммы до четырех знаков. Тип double в Java хранит 15 знаков после запятой. И как уже говорил — не представляю потери копейки в каких бы то ни было расчетах (если у программиста руки не из жопы растут). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:34:46 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Софтверный проктолог Тип double в Java хранит 15 знаков после запятой. И как уже говорил — не представляю потери копейки в каких бы то ни было расчетах (если у программиста руки не из жопы растут). Не один вменяемый программист никогда в жизни не напишет программу, которая рассчитывает деньги с использованием double. Тип double дает большую погрешность, вот что на сайте sun написано про float и double: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead. Удивительно, что для некоторых это новость. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:54:33 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
wessen Не один вменяемый программист никогда в жизни не напишет программу, которая рассчитывает деньги с использованием double. Тип double дает большую погрешность, вот что на сайте sun написано про float и double: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead. Удивительно, что для некоторых это новость. Будем считать, что я не рассчитываю деньги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 13:58:27 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Вот для примера - обычная задача тех, кто работает с финансами. Суммы налога, составляющие ЕСН (а это 6 налогов на каждого сотрудника ежемесячно) должны рассчитываться с точностью строго 5 знаков после запятой (не больше и не меньше) и накапливаться в течении года. Причем, 5 знаков после запятой и для зарплаты в 1000 рублей и для 100 миллонов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 16:12:06 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
VurnВот для примера - обычная задача тех, кто работает с финансами. Суммы налога, составляющие ЕСН (а это 6 налогов на каждого сотрудника ежемесячно) должны рассчитываться с точностью строго 5 знаков после запятой (не больше и не меньше) и накапливаться в течении года. Причем, 5 знаков после запятой и для зарплаты в 1000 рублей и для 100 миллонов. Код: 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. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 19:29:11 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Для зарплаты в сто миллионов (102 458 787): Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 19:34:03 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Рассчитывая доход корпорации Microsoft в карбованцах несомненно следует пользоваться BigDecimal. А для простых парней, не оперирующих суммами более миллиарда — зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2007, 19:35:13 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
1. Ну это Вы сейчас суммами больше миллиарда не оперируете. А потом кто его знает как пойдет. Вот я уже приближаюсь. Т.е. я уже сейчас использую 9+4 = 13 знаков. 2. Когда Вы создавали BigDecimal при помощи конструктора BigDecimal(double) Вы внесли ошибку в данные, т.к. тип double вносит ошибку в десятичную дробь. Естественно, при этом результаты вычислений оказались идентичными. А размер BigDecimal оказался гораздо больше, чем требовалось для хранения реальных данных, отсюда такая разница в производительности. Если предположить, что BigDecimal мог быть в 5 раз короче, то операция произведения требовала бы в 25 раз меньше времени. 3. Время выполнения теста корректно снимать только после прогона теста несколько раз. Из-за особенностей работы Hotspot. Т.к. BigDecimal - класс Java, логично подождать пока он откомпилируется с более высоким уровнем оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2007, 07:13:19 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Код: 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. Код: plaintext 1. 2. 3. 4. Разница примерно в 400 раз. Варьируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2007, 07:34:50 |
|
||
|
Простой пример, а не работает.
|
|||
|---|---|---|---|
|
#18+
Пример: Рассчет суммы с НДС для 1000 наименований с суммами по наименованиям от 1 копейки до 100000рублей. Вполне реальная задача. Код: 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. double: Сумма: 1.12549509E7 После округления: 11254950.90 BigDecimal: Сумма: 11254951.00 После округления: 11254951.00 Расхождение на 10 копеек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2007, 07:53:27 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=602&tid=2144297]: |
0ms |
get settings: |
17ms |
get forum list: |
21ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
56ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
86ms |
get tp. blocked users: |
2ms |
| others: | 338ms |
| total: | 556ms |

| 0 / 0 |
