2016-04-04 3 views
3

Мне нужно преобразовать длинный (объект один, содержащийся в переменной longValueToConvert) в BigDecimal.Long to String перед преобразованием в BigDecimal

я сделал бы что-то вроде этого:

new BigDecimal(longValueToConvert) 

Но я читал, что это приведение может вызвать ошибки в преобразовании и что он предпочитаемый забрасывать Long в строку, прежде чем использовать его в Конструктор BigDecimal.

new BigDecimal(longValueToConvert.toString()) 

Возможно ли использовать первый или второй вариант? Я использую Java 8.

+0

В коде нет трансляции, и нет, это не вызывает ошибки преобразования. –

ответ

11

Вы слышали неправильно. Ошибка преобразования из конструктора BigDecimal(long). A long можно представить точно, и нет никаких проблем, из-за чего из него выйдет BigDecimal.

Вы должны быть осторожны, только если используете конструктор BigDecimal(double). Это связано с тем, что некоторые значения double не могут быть представлены точно. Из документации:

Результаты этого конструктора могут быть несколько непредсказуемыми. Можно предположить, что запись new BigDecimal(0.1) в Java создает BigDecimal, которая в точности равна 0.1 [...], но на самом деле она равна 0.1000000000000000055511151231257827021181583404541015625. Это связано с тем, что 0.1 не может быть представлен точно как double [...].

Конструктор String, с другой стороны, вполне предсказуем: запись new BigDecimal("0.1") создает BigDecimal, которая точно равна 0.1, как и следовало ожидать. Поэтому обычно рекомендуется использовать конструктор String, предпочитаемый этим.

+2

Кроме того, [заводские методы] (https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#valueOf-long-int-) предпочтительны, поскольку они не всегда создать новый объект. – bcsb1001

1

Вы можете попробовать это:

new BigDecimal(longValueToConvert.longValue()) 

Это прекрасно работает. Я считаю, что ваша озабоченность должна заключаться в представлении чисел с плавающей точкой, поскольку там важна точность. например когда вы используете BigDecimal (double) или BigDecimal(float) конструкторы. У вас есть эти сценарии? Кроме того, здесь вы узнаете все. Long для любого числа с плавающей точкой не является проблемой, но приход с других направлений требует осторожности.

+1

Пока это будет работать, результат будет точно таким же, как «new BigDecimal (longValueToConvert)» –

+0

* «[Преобразование a] в длину до любого числа с плавающей запятой не является проблемой» * - Фактически, преобразование 'long' в 'float' или' double' * can * приводят к потере точности. –

+0

Зачем конвертировать длинный в длинный? Не имеет большого смысла для меня. –