Как получить числа после запятой? (java) [дубликат]
На этот вопрос уже есть ответ здесь:
double d = 4.321562;
Есть ли простой способ извлечь 0.321562 самостоятельно из d? Я попытался заглянуть в класс математики, но безуспешно. Если это можно сделать без преобразования в строку или приведения к чему-либо еще, еще лучше.
3 ответов:
Ну, вы можете использовать:
Обратите внимание, что из-за того, как работает двоичная плавающая точка, это не даст вам точно 0.321562, так как исходное значение не является точно 4.321562. Если вы действительно заинтересованы в точных цифрах, вы должны использоватьdouble x = d - Math.floor(d);BigDecimalвместо этого.
Еще один способ получить дробь, не используя математику, - это бросить в лонг.
double x = d - (long) d;При печати
Способ обойти это-сделать округление самостоятельно или использовать BigDecimal, который позволяет вам управлять округлением.doubleстрока toString будет выполнять небольшое количество округления, поэтому вы не увидите ошибки округления. Однако, когда вы удаляете целочисленную часть, округления уже недостаточно, и ошибка округления становится очевидной.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
Comments