Я согласен с выбранным ответом на использование DecimalFormat
--- или альтернативно BigDecimal
.
Пожалуйста, сначала прочтите Обновление ниже!
Однако, если вы хотите округлить двойное значение и получить результат значения double
, вы можете использовать org.apache.commons.math3.util.Precision.round(..)
, как указано выше. Реализация использует BigDecimal
, медленная и создает мусор. Подобный, но быстрый и не содержащий мусора метод предоставляется утилитой DoubleRounder
в библиотеке decimal4j:
double a = DoubleRounder.round(2.0/3.0, 3);
double b = DoubleRounder.round(2.0/3.0, 3, RoundingMode.DOWN);
double c = DoubleRounder.round(1000.0d, 17);
double d = DoubleRounder.round(90080070060.1d, 9);
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
Будет выводиться
0.667
0.666
1000.0
9.00800700601E10
См. https: //github.com/tools4j/decimal4j/wiki/DoubleRounder-Utility
Отказ от ответственности: Я участвую в проекте decimal4j.
Обновление: Как отметил @iaforek, DoubleRounder иногда возвращает недопустимые результаты. Причина в том, что он выполняет математически правильное округление. Например, DoubleRounder.round(256.025d, 2)
будет округлено до 256.02, потому что двойное значение, представленное как 256.025d, несколько меньше, чем рациональное значение 256.025 и, следовательно, будет округлено.
Примечания:
BigDecimal(double)
(но не на valueOf(double)
, который использует конструктор строк). По тем причинам и всему, что упомянуто выше в этом посте я не могу рекомендовать использовать DoubleRounder.
С обоими запросами похоже, что вы пытаетесь вставить в #temp. #temp находится в одной из баз данных (для аргументов sake, databaseA). Поэтому, когда вы пытаетесь вставить в #temp из databaseB, он сообщает, что он не существует.
Попробуйте изменить его с В #temp Из в В базу данныхA.dbo . # temp Из в обоих утверждениях.
Кроме того, убедитесь, что строки подключения имеют разрешения для другого БД, иначе это не сработает.
Обновление: относящееся к таблице темп выходит из области действия - если у вас есть одна строка соединения, которая имеет разрешения для обеих баз данных, тогда вы можете использовать это для обоих запросов (сохраняя соединение живым). При запросе таблицы в другой БД обязательно используйте [DBName]. [Owner]. [TableName] формат при обращении к таблице.
Вся ваша работа может быть выполнена в одном запросе:
SELECT a.columnA, a.columnB,..., a.columnZ
FROM table2 a
INNER JOIN (SELECT databaseA..table1.column1
FROM databaseA..table1
WHERE databaseA..table1.xyz = 'A') b
ON a.columnB = b.column1
ваша временная таблица выходит за пределы области видимости, она только «жива» во время первого соединения и не будет доступна во втором соединении. Просто переместите все это в одном блоке кода и выполните его внутри одного коннекта