Джава. Как отключить округление в десятичном формате - PullRequest
3 голосов
/ 07 февраля 2011

Можно ли отключить "функцию" округления в десятичном формате?

Например:

DecimalFormat f = new DecimalFormat();</p> <p>f.parseObject("123456789012345.99");

Результат - 1,2345678901234598E14

Java-версия "1.6.0_21"

Ответы [ 3 ]

5 голосов
/ 07 февраля 2011

Это не имеет ничего общего с особенностью Java.Это связано с ограниченной точностью 64-битных двойных чисел IEEE.На самом деле все типы данных имеют пределы своей точности.SO больше, чем другие.

double d = 123456789012345.99;
System.out.println(d);

отпечатки

1.2345678901234598E14

Если вы хотите большей точности, используйте BigDecimal.

BigDecimal bd = new BigDecimal("123456789012345.99");
System.out.println(bd);

печать

123456789012345.99

Даже у BigDecimal тоже есть ограничения, но они намного превосходят то, что вам или кому-либо еще нужно.(~ 2 миллиарда цифр)

РЕДАКТИРОВАТЬ: Самые большие известные простые числа вписываются в BigDecimal http://primes.utm.edu/largest.html

1 голос
/ 07 февраля 2011

Насколько я понял, вы хотите напечатать номер в специальном формате.Вам нужно вызвать applyPattern (String Pattern) как здесь:

  f.applyPattern(".000");
  System.out.println(f.format(123456789.99)); // prints 123456789.990

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

f.setRoundingMode()

Угадайте, где я все это узнал?конечно из Java документы .Узнайте больше о выражении шаблона, чтобы форматировать его так, как вам нравится

1 голос
/ 07 февраля 2011

Нет, это не округление, это просто способ работы чисел с плавающей запятой.

Единственный способ сделать то, что вы хотите, это использовать BigDecimal.

Я бы порекомендовал вам прочитать «Что должен знать каждый компьютерный специалист об арифметике с плавающей точкой».

...