Java глюк?Вычитать числа? - PullRequest
5 голосов
/ 12 ноября 2011

Это глюк в Java?

Я решаю это выражение: 3.1 - 7.1

Я получаю ответ: -3.9999999999999996

Что здесь происходит

Ответы [ 5 ]

10 голосов
/ 12 ноября 2011

Отличное объяснение можно найти здесь. http://www.ibm.com/developerworks/java/library/j-jtp0114/

Арифметика с плавающей точкой редко бывает точной. Хотя некоторые цифры, такие как 0.5, может быть точно представлен в виде двоичного (основание 2) десятичного числа (так как 0.5 равно 2-1), другие числа, такие как 0.1, не могут быть. В результате операции с плавающей запятой могут привести к ошибкам округления, приводящим к результат, который близок - но не равен - результат, который вы могли бы ожидать. Например, простой расчет ниже приводит к 2.600000000000001, а не 2.6:

double s=0;

for (int i=0; i<26; i++)
    s += 0.1;
System.out.println(s); 

Аналогично, умножение .1 * 26 дает результат, отличный от результата добавив .1 к себе 26 раз. Ошибки округления становятся еще серьезнее при приведении с плавающей запятой к целому, потому что приведение к целочисленный тип отбрасывает нецелую часть даже для вычислений что «похожи» они должны иметь интегральные значения. Например, следующие высказывания:

  double d = 29.0 * 0.01;
  System.out.println(d);
  System.out.println((int) (d * 100));

выдаст в качестве вывода:

 0.29
  28  

что, вероятно, не то, что вы могли бы ожидать вначале.

См. Предоставленную ссылку для получения дополнительной информации.

2 голосов
/ 12 ноября 2011

Как уже упоминалось несколькими другими, вы не можете рассчитывать на double, если вы хотите получить точное десятичное значение, например, при реализации денежных приложений. Вместо этого вам стоит присмотреться к BigDecimal :

BigDecimal a = new BigDecimal("3.1");
BigDecimal b = new BigDecimal("7.1");
BigDecimal result = a.subtract(b);
System.out.println(result);      // Prints -4.0
1 голос
/ 12 ноября 2011

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

так же, как 3 * 0.1 != 0.3 (когда он не свернут компилятором по крайней мере)

1 голос
/ 12 ноября 2011

Происходит автоматическое продвижение типов, и это результат.

Вот некоторый ресурс для изучения.

http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html

Следующим шагом будет научиться использовать средства форматирования для форматирования с заданной точностью / требованиями.

1 голос
/ 12 ноября 2011

Компьютеры на 100%, поэтому в математическом мире это правильно, для обычного человека это не так.В Java не может быть ошибки на определенном числе, поскольку это просто код, который выполняется таким же образом, но имеет другой ввод!

PS Google, как округлить число

...