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);