Formatted Output with printf() & Math Utilities
System.out.printf() ยท String.format() ยท Format Specifiers (%d, %f, %.2f, %s, %-15s) ยท java.lang.Math Library (sqrt, pow, abs, max, min, round, random)
Mastering output presentation and mathematical computation in Java: formatting currency, tables, and decimals with printf() and String.format(), along with exhaustive exploration of the standard java.lang.Math utility library.
1. Formatted Output with `System.out.printf()`
While System.out.println() is useful for basic strings, real-world applications (like financial reports and command-line tables) require precise column alignment and decimal rounding.
Java provides System.out.printf() and String.format() modeled after C-style format strings:
System.out.printf("Format String with %specifiers", arg1, arg2, ...);Common Format Specifiers:
| Specifier | Data Type | Description & Example |
|---|---|---|
| **`%d`** |
byte, short, int, long) | Decimal integer: printf("%d", 100) -> 100 |
| %f | Floating Point (float, double) | Decimal number: printf("%f", 3.14) -> 3.140000 |
| %.2f | Formatted Floating Point | Rounds to 2 decimal places: printf("%.2f", 3.14159) -> 3.14 |
| %s | String | Text string: printf("Hello %s", "Ravi") -> Hello Ravi |
| %c | Character | Single character: printf("Grade: %c", 'A') -> Grade: A |
| %b | Boolean | Boolean value: printf("%b", true) -> true |
| %n | Newline | Platform-independent newline separator (prefer over \n). |
2. Column Width & Text Alignment Flags
You can align columns into clean tabular layouts using width and alignment flags:
- %15s (Right-aligned): Pads the string with spaces to occupy at least 15 character widths.
- %-15s (Left-aligned): Pads spaces on the right to align text neatly to the left margin.
- %05d (Zero-padding): Pads numbers with leading zeros (e.g. 00100).
- %,d (Comma Thousands Separator): Formats large numbers with commas (e.g. 1,000,000).
3. The Built-in `java.lang.Math` Library
The Math class contains static mathematical functions and constants (Math.PI, Math.E):
| Method | Returns | Description | Example |
|---|---|---|---|
| **`Math.sqrt(x)`** |
double | Square root of x. | Math.sqrt(16.0) -> 4.0 |
| Math.pow(base, exp) | double | Computes $\text{base}^{\text{exp}}$. | Math.pow(2, 3) -> 8.0 |
| Math.abs(x) | same | Absolute positive value of x. | Math.abs(-25) -> 25 |
| Math.max(a, b) | same | Returns the larger of two values. | Math.max(10, 20) -> 20 |
| Math.min(a, b) | same | Returns the smaller of two values. | Math.min(10, 20) -> 10 |
| Math.round(x) | long | Rounds float/double to nearest integer. | Math.round(4.6) -> 5 |
| Math.floor(x) | double | Rounds down to nearest integer. | Math.floor(4.9) -> 4.0 |
| Math.ceil(x) | double | Rounds up to nearest integer. | Math.ceil(4.1) -> 5.0 |
| Math.random() | double | Generates pseudo-random decimal between 0.0 (inclusive) and 1.0 (exclusive). | (int)(Math.random() * 100) + 1 (1-100) |
Beginner Example & Code Anatomy
public class Main {
public static void main(String[] args) {
// 1. Formatted Output with printf()
String productName = "MacBook Pro M3";
int stockQuantity = 42;
double unitPrice = 199999.956;
System.out.println("--- Table Formatting with printf ---");
System.out.printf("%-20s %-10s %-15s%n", "ITEM NAME", "QTY", "PRICE (INR)");
System.out.println("--------------------------------------------------");
System.out.printf("%-20s %-10d โน%,.2f%n", productName, stockQuantity, unitPrice);
System.out.printf("%-20s %-10d โน%,.2f%n", "Magic Mouse", 120, 8500.00);
System.out.printf("%-20s %-10d โน%,.2f%n", "USB-C Adapter", 300, 1900.50);
// 2. Math Library Utilities
System.out.println("
--- java.lang.Math Utilities ---");
System.out.println("Square Root of 144 : " + Math.sqrt(144));
System.out.println("2 raised to 8 (2^8): " + Math.pow(2, 8));
System.out.println("Absolute of -50.5 : " + Math.abs(-50.5));
System.out.println("Max of (120, 85) : " + Math.max(120, 85));
System.out.println("Round 99.6 : " + Math.round(99.6));
// 3. Random Number Generation between 1 and 6 (Dice Roll)
int diceRoll = (int)(Math.random() * 6) + 1;
System.out.println("Random Dice Roll (1-6): " + diceRoll);
}
}
๐ Line-by-Line Code Explanation
%-20s %-10d โน%,.2f%n
Formats line: 20-character left-aligned string, 10-char integer, comma-separated double rounded to 2 decimal places, followed by newline.
Math.sqrt(144)
Calculates the mathematical square root returning double 12.0.
Math.pow(2, 8)
Calculates 2 to the power of 8 returning double 256.0.
(int)(Math.random() * 6) + 1
Scales Math.random() (0.0 to 0.999) to range 0-5, casts to int, and offsets by +1 yielding random integer 1 to 6.
Practical Real-World Example
public class CircleGeometryEngine {
public static void main(String[] args) {
double radius = 7.5; // Circle radius in cm
// Area = PI * r^2
double area = Math.PI * Math.pow(radius, 2);
// Circumference = 2 * PI * r
double circumference = 2 * Math.PI * radius;
System.out.println("=== Circle Geometric Calculations ===");
System.out.printf("Radius : %.2f cm%n", radius);
System.out.printf("Area : %.4f sq.cm%n", area);
System.out.printf("Circumference : %.4f cm%n", circumference);
}
}
- Using %d for floating point numbers: Passing a double to %d throws IllegalFormatConversionException at runtime. Use %f or %.2f.
- Misunderstanding Math.random() range: Math.random() never returns 1.0 (it returns 0.0 <= x < 1.0). To generate numbers 1 to 10, write "(int)(Math.random() * 10) + 1".
- Forgetting %n in printf: Unlike println(), printf() does NOT append a newline automatically. You must end the format string with "%n" or "\n".
Test your understanding by writing the code directly in your editor or running in our online Java compiler:
// Coding Challenge:
// Given a right-angled triangle with sides: a = 6.0, b = 8.0:
// 1. Calculate hypotenuse c = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2))
// 2. Print formatted output: "Side A: 6.00, Side B: 8.00, Hypotenuse C: 10.00"
public class Main {
public static void main(String[] args) {
double a = 6.0, b = 8.0;
// TODO: Compute hypotenuse using Math library and printf
}
}
๐ก Frequently Asked Questions & Interview Insights
โ What is the difference between %n and \n in printf?
"%n" is the platform-independent line separator that outputs "\r\n" on Windows and "\n" on Linux/macOS. Always use "%n" in printf for maximum portability.
โ Is the Math class constructor accessible?
No. The Math class in java.lang has a private constructor to prevent instantiation. All methods (sqrt, pow, abs) are static and called directly on the Math class name.
โ How does String.format() differ from System.out.printf()?
"printf()" prints the formatted text directly to the console, while "String.format()" returns the formatted text as a new String object that can be stored in a variable, written to a file, or sent over a network.
๐ Quick Chapter Recap
- System.out.printf() and String.format() format text using %d (integers), %f (decimals), %s (strings), and %n (newlines).
- Use %.2f to round decimals and %,d to include thousands separators.
- The java.lang.Math class provides static utilities: sqrt, pow, abs, max, min, round, and random.