обнаружение округления с плавающей точкой - PullRequest
2 голосов
/ 06 ноября 2008

Я использую Java и ссылаюсь на "двойной" тип данных. Короче говоря, я читаю некоторые значения из стандартного ввода, которые я прочитал в своем коде, как двойные (я бы предпочел использовать что-то вроде BigInteger, но сейчас это невозможно).

Я ожидаю получить двойные значения от пользователя, но иногда они могут вводить такие вещи, как: +999999999999999999999999999,9999999999 который, я думаю, не поддается точному представлению для double, а округляется до 1.0E27 (вероятно).

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

Большое спасибо

Ответы [ 3 ]

4 голосов
/ 06 ноября 2008

Большинство значений, введенных людьми, не будут точно представлены двойным.

Например, хотите ли вы запретить пользователю вводить 0,1? Это не совсем представимо в виде двойного.

Чтобы найти масштаб ошибки, вы можете сделать что-то вроде:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

Затем проверьте, является ли "ошибка" приемлемо малой.

2 голосов
/ 06 ноября 2008
double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();
1 голос
/ 06 ноября 2008

Вы не можете использовать двойное число, чтобы хранить что-то точно так, как вы просите, очень редко пользователь может ввести число, которое может представлять двойное число, но это будет только совпадение. Если вам нужно сохранить точное число, вы можете использовать строку, если вам не нужно делать никаких манипуляций. Если вам нужно больше, то, вероятно, есть библиотеки, которые созданы для такой точной математики.

...