Почему конструкция Bigdecimal(double d) все еще существует?

Я заметил существенную боль над этим конструктором (даже здесь, на переполнении стека). Люди используют его, хотя в документации четко сказано:

Результаты этого конструктора могут быть несколько непредсказуемыми http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html

Я даже видел, как JSR-13 был УТВЕРЖДЕН с рекомендацией, в которой говорилось:

Существующие спецификации, которые могут быть признаны устаревшими: мы предлагаем отказаться от конструктора BigDecimal (double), который в настоящее время дает результаты, отличные от метода Double.toString().

Несмотря на все это, конструктор еще не устарел.

Я хотел бы услышать любые взгляды на это.

3 ответа

Решение

Амортизация устарела. Части API помечены как устаревшие только в исключительных случаях.

Итак, запустите FindBugs как часть вашего процесса сборки. FindBugs имеет API подключаемого модуля детектора, а также с открытым исходным кодом (LGPL, IIRC).

Учитывая поведение BigDecimal(double)это правильно, на мой взгляд, я не слишком уверен, что это действительно будет такая проблема.

Я не совсем согласен с формулировкой документации вBigDecimal(double)конструктор:

Результаты этого конструктора могут быть нескольконепредсказуемыми. Можно предположить, что написание new BigDecimal(0.1)в Java создаетBigDecimalкоторый точно равен 0.1 (немасштабированное значение 1 со шкалой 1), но на самом деле он равен 0.1000000000000000055511151231257827021181583404541015625,

(Акцент добавлен.)

Вместо того, чтобы говоритьнепредсказуемо, я думаю, что формулировка должна быть неожиданной, и даже в этом случае это было бы неожиданным поведением для тех, кто не знает об ограничениях представления десятичных чисел со значениями с плавающей запятой.

Если учесть, что значения с плавающей запятой не могут точно представлять все десятичные значения, значение, возвращаемое с помощью BigDecimal(0.1) являющийся 0.1000000000000000055511151231257827021181583404541015625 на самом деле имеет смысл.

Если BigDecimal объект, созданный BigDecimal(double) Конструктор последовательный, тогда я бы сказал, что результат предсказуем.

Я думаю, почему BigDecimal(double) Конструктор не считается устаревшим, потому что поведение может считаться правильным, и пока известно, как работают представления с плавающей запятой, поведение конструктора не слишком удивительно.

Этот конкретный конструктор, как и все операции с плавающей запятой, является приближенным. На самом деле он не сломан, у него просто есть недостатки.
Просто сделайте свое исследование, подойдите к нему с осторожностью, и вы не получите никаких сюрпризов. При назначении десятичных литералов в double /float вы сталкиваетесь с абсолютно одинаковыми вещами.

Другие вопросы по тегам