Подтвердить что ты не робот

Как получить числа после десятичной точки? (Ява)

 double d = 4.321562;

Есть ли простой способ извлечь 0.321562 на свой собственный из d? Я пробовал смотреть в математическом классе, но не повезло. Если это можно сделать без преобразования в строку или кастинг на что-нибудь еще, еще лучше.

4b9b3361

Ответ 1

Ну, вы можете использовать:

double x = d - Math.floor(d);

Обратите внимание, что из-за того, что работает двоичная с плавающей запятой, это не даст вам ровно 0,321562, так как исходное значение не совсем равно 4.321562. Если вас действительно интересуют точные цифры, вы должны использовать BigDecimal.

Ответ 2

Другой способ получить фракцию без использования Math - это сделать длинную.

double x = d - (long) d;

Когда вы печатаете double, toString будет выполнять небольшое количество округления, чтобы вы не заметили ошибки округления. Однако, когда вы удаляете целочисленную часть, округление уже недостаточно, и ошибка округления становится очевидной.

Путь вокруг этого - сделать округление самостоятельно или использовать BigDecimal, который позволяет вам контролировать округление.

double d = 4.321562;
System.out.println("Double value from toString " + d);
System.out.println("Exact representation " + new BigDecimal(d));
double x = d - (long) d;
System.out.println("Fraction from toString " + x);
System.out.println("Exact value of fraction " + new BigDecimal(x));
System.out.printf("Rounded to 6 places %.6f%n", x);
double x2 = Math.round(x * 1e9) / 1e9;
System.out.println("After rounding to 9 places toString " + x2);
System.out.println("After rounding to 9 places, exact value " + new BigDecimal(x2));

печатает

Double value from toString 4.321562
Exact representation 4.321562000000000125510268844664096832275390625
Fraction from toString 0.3215620000000001
Exact value of fraction 0.321562000000000125510268844664096832275390625
Rounded to 6 places 0.321562
After rounding to 9 places toString 0.321562
After rounding to 9 places, exact value 0.32156200000000001448796638214844278991222381591796875

Ответ 3

Использовать по модулю:

double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);