Если это неправильный ответ, что МОЖЕМ использовать для точного деления финансовых расчетов? (Я имею в виду, у меня нет специальности финансов, но они все еще используют разделение, верно ???).
Тогда я был в начальной школе 1 , они научили меня, что, когда вы делите на 1 на 3, вы получаете 0,33333 ... то есть повторяющийся десятичный знак. Деление чисел, представленных в десятичной форме, НЕ является точным. Фактически для любой фиксированной базы будут дроби (результат деления одного целого числа на другое), которые нельзя представить точно как число с плавающей запятой конечной точности в этой базе. (Номер будет иметь повторяющуюся часть ...)
Когда вы делаете финансовые расчеты, связанные с делением, у вас есть , чтобы рассмотреть, что делать с повторяющейся дробью. Вы можете округлить его вверх или вниз, или до ближайшего целого числа, или чего-то еще, но в основном вы не можете просто забыть о проблеме.
BigDecimal Javadoc говорит это:
Класс BigDecimal предоставляет пользователю полный контроль над поведением округления. Если режим округления не указан и точный результат не может быть представлен, генерируется исключение; в противном случае вычисления могут быть выполнены с выбранной точностью и режимом округления путем предоставления соответствующего объекта MathContext для операции.
Другими словами, ваша обязанность сообщить BigDecimal, что делать с округлением.
РЕДАКТИРОВАТЬ - в ответ на эти наблюдения из OP.
Как BigDecimal обнаруживает бесконечное повторяющееся десятичное число?
Он явно не определяет повторяющиеся десятичные числа. Он просто обнаруживает, что результат какой-либо операции не может быть точно представлен с использованием указанной точности; например слишком много цифр требуется после десятичной точки для точного представления.
Он должен отслеживать и обнаруживать цикл в дивиденде. МОЖЕТ БЫТЬ ВЫБРАНО, чтобы справиться с этим другим путем, отметив, где находится повторяющаяся часть и т. Д.
Полагаю, что BigDecimal
можно было бы указать для точного представления повторяющегося десятичного числа; то есть как BigRational
класс. Однако это сделает реализацию более сложной и более дорогой в использовании 2 . А так как большинство людей ожидают, что числа будут отображаться в десятичном виде, и проблема повторяющегося десятичного числа повторяется в этой точке.
Суть в том, что эти дополнительные сложности и затраты времени выполнения были бы неуместными для типичных сценариев использования для BigDecimal
. Это включает в себя финансовые расчеты, где правила бухгалтерского учета не позволяют использовать повторяющиеся десятичные дроби.
1 - Это была отличная начальная школа ...
2 - Либо вы пытаетесь устранить общие факторы делителя и дивиденда (вычислительно дорого), либо позволить им расти без границ (дорого в использовании пространства ... и вычислительно для последующих операций).