Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > oracle number -> BigDecimal |
Автор: KostenkoSergey 11.9.2007, 11:06 | ||
Столкнулся с такой вот проблемой : Выполняя запрос (select mynumber from mytable)в пл\скл девелопере получаю 9.8, а при использовании
Получаю 9.799999999999999 Подскажите с чем это связано и как побороть ? |
Автор: dorogoyIV 11.9.2007, 11:20 | ||
если побороть в смысле округлить
1 - это количество знаков после запятой. второй параметр - способ округления, их несколько разных есть. |
Автор: KostenkoSergey 11.9.2007, 11:44 |
да, я думал об этом - но в таком случае если в поле нумбер будет целое число - оно допишет .0, да и заранее сколько знаков после запятой будет я не знаю. |
Автор: dorogoyIV 11.9.2007, 12:14 | ||
посмотри такой код. может пригодится?
|
Автор: KostenkoSergey 11.9.2007, 12:34 | ||
- не совсем понял, что ты хотел показать фрагментом кода. Свой вопрос пока решил следующим образом:
ps буду надеяться размерности флоата будет достаточно. |
Автор: dorogoyIV 11.9.2007, 13:56 | ||
в учебнике у меня написано:
|
Автор: niasilil 13.11.2008, 08:09 |
bump Правлю чужой код, сравниваю баланс - фиг вам, куда то подевался цент. Пытаюсь найти, все вроде нормально, но цента нет. Было что то типа 89.21 стало несколько платежей но в сумме 89.20 Оказалось оно - кто то использовал BigDecimal(double) вместо BigDecimal(String). Вообще непонятен глубокий смыслтакого поведения конструктора с double. Ведь ясно же что баг, так нет, записали в API как feature. |
Автор: niasilil 16.11.2008, 08:19 | ||||||
Баг это, баг. Просто его объявили фичей. Ничего мы тут не считаем, просто создаем объект. Можно просто в лоб заменить весь конструктор
на
и все будет работать как и должно. Мне Рабинович напел что в сях такого безобразия нет, сам не проверял. Вот
выдает как и положено 0.1000000000000000055511151231257827021181583404541015625 0.1 |
Автор: dorogoyIV 16.11.2008, 12:04 |
не баг это, не баг! повторите первый курс института (высшая математика) ![]() |
Автор: niasilil 17.11.2008, 03:38 | ||||
и как же это не баг если два конструктора выдают два разных значения? просто из общих соображений.
dorogoyIV, какую конкретно часть первого курса высшей математики вы имеете ввиду? я как бы немного с этим знаком, кандидат физмат наук как никак. Было бы все же полезнее аргументировать, а не так. Я не обязан вам верить на слово. фиг с ним, баг это или не баг. Но вот объясните мне зачем используется два разных способа создания объекта в двух разных конструкторах? Какой в этом смысл? По мне так это бред полный. |
Автор: dorogoyIV 17.11.2008, 12:30 |
niasilil, наверное с этим связано? |
Автор: w1nd 17.11.2008, 13:23 | ||
Не разные способы конструкции приводят к отклонениям, а разные значения параметров. Иными словами, 0.1D - совсем не то же самое, что "0.1". Именно об этом и просил вас вспомнить dorogoyIV. |
Автор: avvo 21.11.2008, 00:48 |
http://en.wikipedia.org/wiki/IEEE_754-1985 А высшая математика тут, да, не при чем. Тут только "низшая", то бишь арифметика. ![]() Да и в том, что два разных конструктора создают два разных объекта, мне, как простому инженеру, кажется, ничего удивительного нет. |
Автор: niasilil 21.11.2008, 07:29 |
Хотел поспорить, аргументы подготовил, но все стер нафиг - разговор немого с глухим получается. Вы мне объясняете почему теряется точность, так это очевидно почему. И из кода конструкторов видно. Мне совсем неочевидно другое. Как по вашему, где может применяться конструктор new BigDecimal(double d), если сразу в API написано что результат непредсказуем? Пример бы помог меня убедить. Если примеров нет, то предлагаю согласиться что разумно было бы depricate этот конструктор и все тут. |
Автор: w1nd 21.11.2008, 11:58 | ||
Машинные типы с плавающей точкой используют там, где важна скорость и совершенно не важна исключительная точность - графика, звук и т. п. Но согласитесь, было бы странно, если бы BigDecimal нельзя было бы сконструировать от некоторых типов чисел ;) И ещё раз. Ваше упование на точность при использовании double - странно. Такие числа нельзя даже сравнивать с помощью оператора ==. |