вопрос:
При выполнении операции по двум двойным типам значений иногда возникают проблемы с аномальными значениями результата. например:
System.out.println (19.99+20); System.out.println (1.0-0.66); System.out.println (0,033*100); System.out.println (12,3/100);
Выход:
39.989999999999999999995
0,33999999999999999999997
3.300000000000000003
0,123000000000000001
Решение:
Простые типы плавающих точек плавают и удваивают в Java не могут выполнять операции, потому что в большинстве случаев это нормально, но иногда возникают проблемы, как показано выше. Эта проблема на самом деле не является ошибкой в Java, потому что сам компьютер является бинарным, а числа с плавающей точкой на самом деле являются просто приблизительными значениями. Следовательно, при преобразовании из бинарных в десятичные значения числа с плавающей запятой, точность легко теряется, что приводит к снижению точности.
Чтобы обеспечить точность, вы должны использовать большой класс, и вы не можете напрямую конвертировать из двойного в BigDecimal. Вы должны преобразовать двойной в строку, а затем BigDecimal. То есть вы не можете использовать метод BigDecimal (Double Val), и вы обнаружите, что нет никакого эффекта. Чтобы использовать метод BigDecimal (String Val). Конкретные примеры показаны ниже.
Примеры четырех операций двойного типа:
1. Сложите
Public Static Double Add (Double A1, Double B1) {BigDecimal A2 = новый BigDecimal (Double.ToString (A1)); BigDecimal B2 = новый BigDecimal (Double.ToString (B1)); вернуть a2.add (b2) .doublevalue (); }2. Вычитание
Public Static Double Sub (Double A1, Double B1) {BigDecimal A2 = новый BigDecimal (Double.ToString (A1)); BigDecimal B2 = новый BigDecimal (Double.ToString (B1)); вернуть a2.subtract (b2) .doublevalue (); }3. Умножьте
Public Static Double Mul (Double A1, Double B1) {BigDecimal A2 = новый BigDecimal (Double.ToString (A1)); BigDecimal B2 = новый BigDecimal (Double.ToString (B1)); вернуть a2.multiply (b2) .doublevalue (); }4. разложение
Public Static Double Div (Double A1, Double B1, int Scale) {if (Scale <0) {бросить новый allosalargumentException ("ошибка"); } BigDecimal A2 = новый BigDecimal (Double.ToString (A1)); BigDecimal B2 = новый BigDecimal (Double.ToString (B1)); вернуть a2.divide (b2, scale, bigdecimal.round_half_up) .doublevalue (); }Когда параметр масштаба делится на неполное, укажите точность.
Решение аномального результата работы двойного типа в Java - это все контент, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.