double d = 4.321562;
Есть ли простой способ извлечь 0.321562 на свой собственный из d? Я пробовал смотреть в математическом классе, но не повезло. Если это можно сделать без преобразования в строку или кастинг на что-нибудь еще, еще лучше.
double d = 4.321562;
Есть ли простой способ извлечь 0.321562 на свой собственный из d? Я пробовал смотреть в математическом классе, но не повезло. Если это можно сделать без преобразования в строку или кастинг на что-нибудь еще, еще лучше.
Ну, вы можете использовать:
double x = d - Math.floor(d);
Обратите внимание, что из-за того, что работает двоичная с плавающей запятой, это не даст вам ровно 0,321562, так как исходное значение не совсем равно 4.321562. Если вас действительно интересуют точные цифры, вы должны использовать BigDecimal
.
Другой способ получить фракцию без использования 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
Использовать по модулю:
double d = 3.123 % 1;
assertEquals(0.123, d,0.000001);