| Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
| Все форумы / Java |
![]() |
||
| Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
|
vladik_k Member Откуда: Сообщений: 60 |
BigDecimal x = new BigDecimal("45.457"); System.out.println(x.toBigInteger()); -- вывидет 46 а как бы мне произвести округление не до целого, а до порядка сотен, т.е. что мне надо сделать, чтобы получить 45.46? |
| 2 ноя 06, 09:40 [3345187] Ответить | Цитировать Сообщить модератору | |
|
Vladimir Kozlov Member Откуда: Игогоевск-на-Усяве, учреждение ИТК-6313 Сообщений: 1085 |
round(45.457*100)/100.00 |
||
| 2 ноя 06, 10:46 [3345656] Ответить | Цитировать Сообщить модератору | |||
|
Ruslan.Isbarov Member Откуда: St. Petersburg Сообщений: 1140 |
BigDecimal x = new BigDecimal("45.457");
x = x.setScale(2, BigDecimal.ROUND_HALF_UP); /* 2 - количество знаков после запятой */
System.out.println("x = " + x.doubleValue());
Округлит до 45.46 |
| 2 ноя 06, 10:49 [3345680] Ответить | Цитировать Сообщить модератору | |
|
Ruslan.Isbarov Member Откуда: St. Petersburg Сообщений: 1140 |
А вот этого стоит опасаться! Почитайте тут |
||||
| 2 ноя 06, 10:50 [3345690] Ответить | Цитировать Сообщить модератору | |||||
|
Vladimir Kozlov Member Откуда: Игогоевск-на-Усяве, учреждение ИТК-6313 Сообщений: 1085 |
Почитал. Согласен с тем что в финансовых расчетах это опасно. Но, если уж у человека возникла необходимость в округлении, значит исходные данные скорее всего уже не годятся для финансовых расчетов, возможно это могут быть какие-то физические либо математические расчеты. Если уж округлить третий знак, то по сравнению с этим то что делается в 10-12 знаке double - очень маленькая погрешность :) |
||||
| 2 ноя 06, 11:25 [3346007] Ответить | Цитировать Сообщить модератору | |||||
|
vladik_k Member Откуда: Сообщений: 60 |
а как округлить число, например: 4.5635 не до 4.564, а до 4.563? |
| 2 ноя 06, 15:28 [3348184] Ответить | Цитировать Сообщить модератору | |
|
^ozzy^ Member Откуда: Сообщений: 466 |
BigDecimal bigDecimal = new BigDecimal("45.457");
bigDecimal = bigDecimal.setScale(3, [roundingMode]);
System.out.println(bigDecimal.doubleValue());
where [roundingMode] is:
|
||
| 3 ноя 06, 00:45 [3350693] Ответить | Цитировать Сообщить модератору | |||
|
vladik_k Member Откуда: Сообщений: 60 |
есть непонятка! :) пишу: BigDecimal bd = new BigDecimal("45.455"); bd = bd.setScale(2, BigDecimal.ROUND_HALF_DOWN); System.out.println("bd = "+bd.doubleValue()); System.out.println("-----------------------------------------------------"); BigDecimal bc = new BigDecimal("45.455000001"); bc = bc.setScale(2, BigDecimal.ROUND_HALF_DOWN); System.out.println("bc = "+bc.doubleValue()); выводит: bd = 45.45 ---------------------- bc = 45.46 ПОЧЕМУ ТАК? В одном случае округлило так, как надо, а в другом - нет???? |
| 4 ноя 06, 12:26 [3356649] Ответить | Цитировать Сообщить модератору | |
|
mimoprohodil
Guest |
Да и в другом случае округлило правильно - перечитайте описание: BigDecimal.ROUND_HALF_DOWN Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. Behaves as for ROUND_UP if the discarded fraction is > 0.5; otherwise, behaves as for ROUND_DOWN. BigDecimal.ROUND_UP Rounding mode to round away from zero. Always increments the digit prior to a nonzero discarded fraction. Note that this rounding mode never decreases the magnitude of the calculated value. |
| 4 ноя 06, 17:55 [3357107] Ответить | Цитировать Сообщить модератору | |
|
IDVsbruck Member Откуда: Украина Сообщений: 4072 |
А если нужно не для вычислений, а для простого вывода строки, то String aaa = new java.text.DecimalFormat("0.00").format(YourNumber); |
| 11 ноя 06, 20:25 [3387090] Ответить | Цитировать Сообщить модератору | |
|
Али-баба Member [заблокирован] Откуда: Сообщений: 41 |
Подскажите как преобразовать число к нормальному виду: String buff = Double.toString(rs.getDouble(colName)); в результате число вида 2342423543 получаеться вида: 2.342423543E9 число вида 980 в виде 980.0 Как сделать чтобы число в buff ложилось в нормальном виде. |
| 15 ноя 06, 15:08 [3404265] Ответить | Цитировать Сообщить модератору | |
|
LINUXER Member Откуда: Сообщений: 1358 |
javax.swing.text.NumberFormatter? |
||
| 15 ноя 06, 15:49 [3404655] Ответить | Цитировать Сообщить модератору | |||
|
Али-баба Member [заблокирован] Откуда: Сообщений: 41 |
Вот мне предложили такой вариант: nf = new DecimalFormat("0.####"); String buff = new String(nf.format(number)); но все равно получаеться не универсально - не всегда известно сколько знаков после запятой. Да и результат получаеться с запятой вместо точки - видно зависит от настроек компьютера. |
| 15 ноя 06, 18:22 [3405892] Ответить | Цитировать Сообщить модератору | |
| Между сообщениями интервал более 1 года. |
|
Tice Member Откуда: Сообщений: 40 |
Вот к размышлению : Нуна округлять всегда вниз до 2 знаков после запятой. Входной и выходной параметр double. Используем BigDecimal.ROUND_DOWN. Почти всегда работает правильно ;)
import java.math.BigDecimal;
public class RoundDown
{
public RoundDown()
{
}
public static double roundDownScale2(double aValue)
{
BigDecimal decimal = new BigDecimal(aValue);
// decimal = decimal.setScale(10,BigDecimal.ROUND_UP);
decimal = decimal.setScale(2,BigDecimal.ROUND_DOWN);
double result = decimal.doubleValue();
return result;
}
public static void main(String[] args)
{
double value = 28.68d;
double valueRounded = roundDownScale2(value);
System.out.println("value = " + value);
System.out.println("valueRounded = " + valueRounded);
value = 28.681d;
valueRounded = roundDownScale2(value);
System.out.println("value = " + value);
System.out.println("valueRounded = " + valueRounded);
}
}
Погрешности погрешности погрешности.... Попробуйте раскоментировать строчку в методе ;) З.Ы. мона канешно не использовать BigDecimal :) но использовали... |
| 18 янв 08, 19:29 [5174497] Ответить | Цитировать Сообщить модератору | |
| Между сообщениями интервал более 1 года. |
|
igvar Member Откуда: Украина, Киев Сообщений: 5 |
BigDecimal d = new BigDecimal(1.555); System.out.println(d.setScale(2, RoundingMode.HALF_UP)); получаем 1.55 почему? |
| 27 сен 10, 15:20 [9507939] Ответить | Цитировать Сообщить модератору | |
|
календаревед Member Откуда: Сообщений: 341 |
наверное из-за того, что:BigDecimal d = new BigDecimal(1.555); System.out.println(d); System.out.println(d.setScale(2, RoundingMode.HALF_UP)); результат: 1.5549999999999999378275106209912337362766265869140625 1.55 BigDecimal d = new BigDecimal(1.5550000000001); System.out.println(d); System.out.println(d.setScale(2, RoundingMode.HALF_UP));результат: 1.55500000000010007994433181011117994785308837890625 1.56 См. binary float point - http://www.h-schmidt.net/FloatApplet/IEEE754.html
|
||
| 27 сен 10, 15:54 [9508278] Ответить | Цитировать Сообщить модератору | |||
|
igvar Member Откуда: Украина, Киев Сообщений: 5 |
со стандартом IEEE754 знаком ;) значение 1.554999999999999937... видел. но в процессе установки scale = 2 должно выполнятся округления вверх (в соответствии с режимом округления RoundingMode.HALF_UP). каким образом тогда выполняется округление, если на выходе мы получаем 1.55? получается, если исходное значение не может быть точно представлено в виде числа с плавающей запятой, то и округление такого неточного значения приводит к неточному результату? |
| 27 сен 10, 17:06 [9509084] Ответить | Цитировать Сообщить модератору | |
|
igvar Member Откуда: Украина, Киев Сообщений: 5 |
String str = Double.valueOf(1.555).toString(); BigDecimal d = new BigDecimal(str); System.out.println(d.setScale(2, RoundingMode.HALF_UP)); результат: 1.56 конструктор BigDecimal(String val): This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn't suffer from the unpredictability of the BigDecimal(double) constructor. |
| 29 сен 10, 11:54 [9521318] Ответить | Цитировать Сообщить модератору | |
| Между сообщениями интервал более 1 года. |
|
grok Member Откуда: Сообщений: 1018 |
а без BigDecimal, обычный double, как-нибудь округлить можно до 2 знаков ? |
| 26 дек 11, 15:22 [11827240] Ответить | Цитировать Сообщить модератору | |
|
Blazkowicz Member Откуда: http://rsdn.ru/forum/java Сообщений: 13033 |
А смысл? |
||
| 26 дек 11, 15:35 [11827346] Ответить | Цитировать Сообщить модератору | |||
|
забыл ник Member Откуда: Сообщений: 1628 |
Смысл есть в инженерных расчетах, когда надо оценить возможное значение, когда не важно 1, 99 или 2.01 |
| 26 дек 11, 15:46 [11827459] Ответить | Цитировать Сообщить модератору | |
|
grok Member Откуда: Сообщений: 1018 |
слово Big пугает особенно когда надо округлить миллион чисел |
||||
| 26 дек 11, 16:30 [11827851] Ответить | Цитировать Сообщить модератору | |||||
|
Blazkowicz Member Откуда: http://rsdn.ru/forum/java Сообщений: 13033 |
Как-как? Т.е. мы округлим double до 2х знаков после запятой. Получим десятичную погрешность примерно соизмеримую со значением, на которое мы округлили, и это будет важно в каких-то там расчетах? |
||
| 26 дек 11, 16:31 [11827853] Ответить | Цитировать Сообщить модератору | |||
|
забыл ник Member Откуда: Сообщений: 1628 |
Ну например тебе надо заскэйлить картинку, не пихать же туда BigDecimal |
||
| 26 дек 11, 16:33 [11827868] Ответить | Цитировать Сообщить модератору | |||
|
Blazkowicz Member Откуда: http://rsdn.ru/forum/java Сообщений: 13033 |
Ну, для массивных обработок, можно к разным ухищрениям прибегать. Начните с деление и умножения на 100. |
||
| 26 дек 11, 16:38 [11827930] Ответить | Цитировать Сообщить модератору | |||
| Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
| Все форумы / Java | ![]() |
|