Как я могу определить, будет ли десятичное число, представленное в виде строки, совпадать с двойным? - PullRequest
0 голосов
/ 07 ноября 2018

Я анализирую строковое значение, которое, как я знаю, содержит число.

Если он содержит только цифры и находится между Integer.MIN_VALUE и Integer.MAX_VALUE, я анализирую его как int, так же, как и долго, иначе я использую BigInteger.

Если оно содержит десятичное значение, я бы хотел проанализировать его как double или как BigDecimal.

Могу ли я проверить, соответствует ли числовое значение в строке двойному и поэтому безопасно анализировать как двойное, или его нужно хранить в BigDecimal для предотвращения потери точности?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Класс Double содержит следующие константы:

public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308

вы можете использовать их для выполнения ваших проверок, если можете.
Но не будет ли проще просто блок try/catch:

String str = "1234567890";
double number = 0;
try {
    number = Double.parseDouble(str);
} catch (NumberFormatException e) {
    e.printStackTrace();
    // put extra code here
}
0 голосов
/ 07 ноября 2018

Я бы проанализировал его как BigDecimal и затем проверил, может ли double хранить значение без потери информации в приемлемой степени.

0 голосов
/ 07 ноября 2018

и поэтому безопасно анализировать как двойное число, или его нужно хранить в BigDecimal для предотвращения потери точности?

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

Число 0.1 может соответствовать в double, но оно не является точным (поскольку 0.1 не может быть точно представлено в двоичном виде). ​​

См .: Математика с плавающей запятой не работает?

...