Как правильно разобрать строку со значениями с плавающей запятой с заданным количеством десятичных знаков в целое число? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть значения с плавающей запятой с заданным количеством десятичных знаков. В этом примере 2 десятичных знака.

Например:

33.3
134.45

Из этих строк я хочу получить следующие целые числа:

3330
13445

Я хочу разобрать эти строки эквивалентны целочисленным значениям, используя тот факт, что мы заранее знаем количество десятичных знаков. В этом примере это 2, поэтому фактическое число с плавающей запятой / двойное число нужно умножить на 100.

Я пробовал следующий код, но он разбирает 33.3 в 3329 вместо 3330.

Это код, который я пробовал:

public class HelloWorld{

     public static void main(String []args){

        int decimalDigits = 2;
        String strNumber = "33.3";
        double doubleNumber = Double.parseDouble(strNumber);
        int intNumber = (int)(Double.parseDouble(strNumber) * (double)Math.pow(10,decimalDigits) );

        System.out.println(strNumber);
        System.out.println(doubleNumber);
        System.out.println(intNumber);

     }
}

И вот результат:

$javac HelloWorld.java
$java -Xmx128M -Xms16M HelloWorld
33.3
33.3
3329

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Для поддержания точности я рекомендую использовать BigDecimal:

int decimalDigits = 2;
String strNumber = "33.3";
BigDecimal decimalNumber = new BigDecimal(strNumber);
int intNumber = decimalNumber.movePointRight(decimalDigits).intValue();

System.out.println(strNumber);
System.out.println(decimalNumber);
System.out.println(intNumber);

Выход:

33.3
33.3
3330
0 голосов
/ 16 апреля 2020

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

(int)Math.round(Float.parseFloat(strNumber) * Math.pow(10,decimalDigits));
0 голосов
/ 16 апреля 2020

Использовать BigDecimal:

String res = new BigDecimal("33.3").multiply(new BigDecimal("10"))
  .setScale(0, ROUND_UNNECESSARY)
  .toPlainString()
...