обнаружение округления с плавающей точкой

StackOverflow https://stackoverflow.com/questions/268652

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top