Преобразование строки в BigDecimal в java

Я читаю валюту из XML в Java.

String currency = 135.69;

Когда я конвертирую это в BigDecimal, я получаю:

 System.out.println(new BigDecimal(135.69));

Вывод:

135.68999999999999772626324556767940521240234375.

Почему он выводит много цифр? Как я могу избежать этого? Все, что я хочу, это выход 135.69.

Ответ 1

У конструктора BigDecimal (double) есть некоторые проблемы, предпочтительнее использовать BigDecimal (String) или BigDecimal.valueOf(double).

System.out.println(new BigDecimal(135.69)); //135.68999999999999772626324556767940521240234375
System.out.println(new BigDecimal("135.69")); // 135.69
System.out.println(BigDecimal.valueOf(135.69)); // 135.69

Документация BigDecimal (double) объясняет это поведение:

  • Результаты этого конструктора могут быть несколько непредсказуемыми. Можно предположить, что запись нового BigDecimal (0.1) в Java создает BigDecimal, который в точности равен 0,1 (немасштабированное значение 1 со шкалой 1), но на самом деле оно равно 0,1000000000000000055511151231257827021181583404541015625. Это связано с тем, что 0,1 не может быть представлен точно как двойной (или, если на то пошло, как двоичная доля любой конечной длины). Таким образом, значение, которое передается конструктору, не точно равно 0,1, независимо от того, что происходит.
  • Конструктор String, с другой стороны, совершенно предсказуем: запись нового BigDecimal ( "0.1" ) создает BigDecimal, который точно равен 0,1, как и следовало ожидать. Поэтому, как правило, рекомендуется использовать конструктор String для этого.
  • Когда в качестве источника для BigDecimal следует использовать double, обратите внимание, что этот конструктор обеспечивает точное преобразование; он не дает того же результата, что и преобразование double в String с использованием метода Double.toString(double), а затем с использованием конструктора BigDecimal (String). Чтобы получить этот результат, используйте статический метод valueOf (double).

Ответ 2

String currency = "135.69";
System.out.println(new BigDecimal(currency));

//will print 135.69

Ответ 3

Можно добавить что-нибудь. Если вы используете валюту, вы должны использовать шкалу (2), и вам, вероятно, следует выяснить круглый метод.

Ответ 4

Вы храните 135,69 в виде строки в валюте. Но вместо передачи переменной валюты вы снова передаете 135,69 (двойное значение) в новый BigDecimal(). Итак, вы видите много цифр в выводе. Если вы передадите переменную валюты, вы получите 135.69

Ответ 5

BigDecimal b = BigDecimal.valueOf(d);

import java.math.*; 

public class Test { 

    public static void main(String[] args) 
    { 

        // Creating a Double Object 
        Double d = new Double("785.254"); 

        /// Assigning the bigdecimal value of ln to b 
        BigDecimal b = BigDecimal.valueOf(d); 

        // Displaying BigDecimal value 
        System.out.println("The Converted BigDecimal value is: " + b); 
    } 
}

Ответ 6

Привет, ребята, вы не можете преобразовать напрямую строку в bigdecimal

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

String currency = "135.69"; 
Long rate1=Long.valueOf((currency ));            
System.out.println(BigDecimal.valueOf(rate1));