2015-11-09 4 views

ответ

1

Не используйте первый подход. Если строка представляет значение, которое не может быть точно представлено double, вы получите проблемы с точностью.

Вы также не можете использовать второй подход, так как нет перегрузки BigDecimal.valueOf, которая принимает строку.

Таким образом, вариант 3:

BigDecimal selAmount = new BigDecimal(amount); 
+0

Вы уверены, что BigDecimal.valueOf() принимает строку ??. Я получаю ошибку в той же строке. – gladis

+0

О, хорошо. Должен быть «новый BigDecimal». http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String) –

0

Вы можете передать строку непосредственно в конструктор BigDecimal.

0

BigDecimal.valueOf(double)); вызовы return new BigDecimal(Double.toString(val)); неявно. Итак, ваш второй случай будет более эффективным, и, как говорит Тило, более правильно.

Код:

*/ 
public static BigDecimal valueOf(double val) { 
    // Reminder: a zero double returns '0.0', so we cannot fastpath 
    // to use the constant ZERO. This might be important enough to 
    // justify a factory approach, a cache, or a few private 
    // constants, later. 
    return new BigDecimal(Double.toString(val)); 
} 
+3

Не только более эффективный, Double.parseDouble потеряет точность (и, возможно, не сможет даже разобрать очень большие цифры). – Thilo

0

Второй подход лучше продолжать, просто передать строку в конструктор BigDecimal. Первый подход может иметь проблемы с точностью.

JavaDocs С имеет

общественного BigDecimal (String вал)

Переводит строковое представление BigDecimal в BigDecimal. Строковое представление состоит из необязательного знака: '+' ('\ u002B') или '-' ('\ u002D'), за которым следует последовательность из 0 или более десятичных цифр ("целое число"), фракцией , необязательно с последующим показателем.

0

Передача строки в качестве конструктора - лучший способ. Вы потеряете точность в первом случае.

например

Строка с = "123";
BigDecimal bigDecimal = new BigDecimal (s);

Смежные вопросы