Как прочитать двойное значение с определенной точностью - PullRequest
0 голосов
/ 04 июня 2010

Как читать двойное значение из строки с определенной точностью (скажем, 4), предполагая, что строка содержит что-то вроде «10.1234», используя это api

Ответы [ 5 ]

4 голосов
/ 04 июня 2010

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

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

Для получения дополнительной информации прочитайте Руководство с плавающей точкой .

3 голосов
/ 04 июня 2010
System.out.println(new Double(new BigDecimal("10.123456789").
        setScale(4, BigDecimal.ROUND_DOWN). // choose precision and specify rounding policy
        doubleValue()
        ));

>> run:
10.1234
0 голосов
/ 04 июня 2010

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

        String[] tests = {
            "12",
            "12.",
            "12.3",
            "12.34",
            "12.345",
            "12.3456",
            "12.34567",
            "-123.45678",
            "1.23456.789.0",
        };
        for (String test : tests) {
            String truncated = test.replaceAll("(\\.\\d{4}).*", "$1");
            System.out.printf("%15s %15s %15s%n",
                test, truncated, Double.valueOf(truncated)
            );
        }

Это печатает:

             12              12            12.0
            12.             12.            12.0
           12.3            12.3            12.3
          12.34           12.34           12.34
         12.345          12.345          12.345
        12.3456         12.3456         12.3456
       12.34567         12.3456         12.3456
     -123.45678       -123.4567       -123.4567
  1.23456.789.0          1.2345          1.2345

Как работает регулярное выражение

Захватывает буквальный ., за которым следуют до четырех цифр \d{4} в \1. Он также соответствует всем остальным, что может следовать за .*, и заменяет все это на $1 (обратная ссылка на то, что \1 захвачено).

Преимущество этого, скажем, простого, например, indexOf подхода в том, что он работает, даже когда нет 4 цифр или даже когда вообще нет десятичной точки, не требуя специальной обработки. 1020 *

Смотри также

0 голосов
/ 04 июня 2010

Я предполагаю, что ваша строка также содержит буквы. Вы можете сначала разобрать номер из строки:

String numberString = ...
int precision = ...

int index = numberString.indexOf(".");
numberString = numberString.substring(0, index+precision+1); // Maybe without "+1"
Double number = Double.valueOf(numberString);
0 голосов
/ 04 июня 2010

Вы можете сделать что-то вроде

Math.round (число * 100) / 100

, чтобы получить точность, но это, вероятно, не будет делать то, что вы хотите из-за внутреннего представленияплавает и удваивается.

Если вам действительно нужно работать с фиксированным числом цифр после десятичной точки, рассмотрите возможность использования BigDecimal.

Для форматирования вывода вы можете использовать C-подобную функцию printf, описанную в эта статья .Это не красиво, но практично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...