Введение в BigDecimal
Объяснение в документе JDK (китайский) выглядит следующим образом:
Неизменное, подписанное десятичное количество произвольной точности. BigDecimal состоит из целочисленного немасштабного значения любой точной и 32-разрядной целочисленной шкалы. Если он нулевой или положительный, шкала - это количество цифр после десятичной точки. Если это отрицательное число, умножьте немасштабное значение числа на отрицательную масштабную мощность 10. Следовательно, значение, представленное BigDecimal, составляет (UnscaledValue × 10-Scale).
Конкретное объяснение
1. «Значение большего объекта неизменно». Это показывает эту функцию в функции операции BigDecimal объекта:
Кода -копия выглядит следующим образом: BigDecimal a = new BigDecimal ("1.22");
System.out.println («Построить со строковым значением:" + a);
BigDecimal B = новый BigDecimal ("2,22");
A.Add (b);
System.out.println ("A Plus B IS:" + A);
Легко думать, что он будет выводить:
Построить с помощью StringValue: 1.22
A Plus B: 3,44
Но на самом деле плюс B: 1,22
2. »Bigdecimal состоит из целочисленного немасштабного значения любой точки и 32-разрядной целочисленной шкалы. Если значение масштаба равна нулю или положительному, шкала-это количество цифр после десятичной точки». Это предложение можно прочитать так:
Например: -12 и 13.412
Выражается как: -12 × 10-0 и 13412 × 10-3
Здесь (не масштабирующие значения и шкалы) представлены как: [-12, 0] и [13412, 3] соответственно
3. "Если значение шкалы является отрицательным числом, умножьте немасштабное значение числа на отрицательную масштабную мощность 10". Это предложение можно прочитать так:
Например: 120.00
Это значение выражено как: 12000 × 10-2
Здесь (не масштабное значение и масштаб) выражены как: [12000, 2]
Значение шкалы здесь все еще положительно 2, но выполните следующие операции:
BigDecimal Sum = New BigDecimal ("-120,00");
// возвращает Bigdecimal численность, равную этому десятичному, но удаляет все нули хвоста из этого представления.
сумма = сумма.
Это значение выражено как: 12 × 10-(-1)
Здесь (не масштабное значение и масштаб) выражены как: [12, -1]
Примечания об использовании
1. Конструктор
Кода кода следующая: BigDecimal Adouble = new BigDecimal (1.22);
System.out.println («Конструкция с двойным значением:« + adouble);
BigDecimal Astring = New BigDecimal ("1.22");
System.out.println («Построить со строковым значением:" + arsting);
Результат вывода заключается в следующем:
Построить с двойным знаком: 1.219999999999999999999973546474089962430298328399658203125
Построить с помощью строкового значения: 1.22
Описание JDK:
а) Результаты метода строительства с двойным типом параметров непредсказуемы. Some people might think that the BigDecimal created by writing newBigDecimal(0.1) in Java is exactly equal to 0.1 (non-scaling value 1, whose scale is 1), but it is actually equal to 0.10000000000000000000000055511151231257827021181583404541015625. Это связано с тем, что 0,1 не может быть выражено точно как двойное (или для этого случая он не может быть выражен как любая бинарная десятичная десятичная конечная длины). Таким образом, значение, передаваемое в метод строительства, не будет точно равным 0,1 (хотя оно является равной этим значением).
б) С другой стороны, строковый конструктор полностью предсказуем: написание NewBigDecimal («0,1») создаст большую значимость, что является именно ожидаемым 0,1. Следовательно, для сравнения, обычно рекомендуется сначала использовать строковый конструктор.
c) Когда двойник должен использоваться в качестве источника для BigDecimal, обратите внимание, что этот конструктор обеспечивает точное преобразование; Он не дает того же результата, что и: сначала используйте метод Double.toString (Double), а затем используйте BigDecimal (строковый) конструктор. Чтобы преобразовать двойной в строку, вы также можете использовать статический метод String: string.valueof (Double).
2. Операция. Добавление, вычитание, умножение и деление фактически возвращают новый BigDecimal объект, потому что BigDecimal неизменен, а новый объект будет генерироваться при выполнении каждого этапа операции, поэтому A.Add (b); Хотя операция добавления выполняется, A не сохраняет значение после операции добавления. Правильное использование должно быть a = a.add (b);
пример:
Определите, является ли Bigdecimal объект целым числом:
Скопируйте код следующим образом: Private Boolean IsintegerValue (BigDecimal BD) {
return bd.signum () == 0 || bd.scale () <= 0 || bd.striptrailingzeros (). Scale () <= 0;
}
Зачем это? Проверьте следующий пример:
Скопируйте код следующим образом: Bigdecimal Summ = new BigDecimal ("-120,00"); // Пожалуйста, попробуйте "0", "0,00", "1,00", "10.00" и "10.10" соответственно
System.out.println (summ.signum ()); // положительный и отрицательный
System.out.println (sutr.scale ()); //Шкала
System.out.println (summ.striptrailingzeros (). Scale ()); // Scale после нуля
Ссылка: класс BigDecimal