Floating-Point Numbers
Vaibhav • September 11, 2025
In the previous article, we explored integer types-perfect for whole numbers like counts, scores, and indexes.
But what if you need to represent fractions, measurements, or currency? That’s where floating-point types come
in. In this article, we’ll introduce the three main floating-point types in C#: float, double, and decimal. We’ll explain how they store numbers, how they differ in precision, and
why choosing the right one is critical-especially in financial applications.
What Are Floating-Point Numbers?
Floating-point numbers represent real numbers-those with decimal points. They’re used when you need to store values like temperature, distance, price, or scientific measurements. Unlike integers, which store exact whole numbers, floating-point types approximate values using a format that balances range and precision.
C# provides three floating-point types:
// Declaration examples
float piApprox = 3.14f;
double precisePi = 3.14159265358979;
decimal price = 19.99m;
Notice the suffixes: f for float, m for decimal. Without them, the compiler
assumes double by default.
Floating-point types are value types, just like integers. They store their data directly in memory and are optimized for performance.
Understanding Precision and Range
Each floating-point type has a different balance of precision (how many digits it can accurately store) and range (how large or small the values can be). Here’s a quick overview:
| Type | Size | Precision | Range |
|---|---|---|---|
float |
4 bytes | ~7 digits | ±1.5 × 10-45 to ±3.4 × 1038 |
double |
8 bytes | ~15-16 digits | ±5.0 × 10-324 to ±1.7 × 10308 |
decimal |
16 bytes | ~28-29 digits | ±1.0 × 10-28 to ±7.9 × 1028 |
float and double use binary floating-point
representation, which is fast and efficient but can introduce rounding errors. decimal uses a base-10 representation, making it ideal for financial and monetary
calculations where precision is critical.
Use float and double for scientific or
engineering data. Use decimal for money, prices, and anything involving
currency.
Precision Differences in Practice
Let’s look at how precision affects calculations. Consider this example:
// Using float
float a = 1.0f / 3.0f;
Console.WriteLine(a); // Output: 0.3333333
// Using double
double b = 1.0 / 3.0;
Console.WriteLine(b); // Output: 0.3333333333333333
// Using decimal
decimal c = 1.0m / 3.0m;
Console.WriteLine(c); // Output: 0.3333333333333333333333333333
Each type gives a different level of precision. float rounds off after 7
digits, double goes further, and decimal
maintains high precision. This matters when you’re doing repeated calculations or comparing values.
Even simple operations like 0.1 + 0.2 may not equal 0.3 when using float or double. That’s due to how binary floating-point works.
Common Pitfalls in Financial Calculations
One of the most frequent mistakes beginners make is using float or double for money. These types can introduce rounding errors that accumulate over
time-leading to incorrect totals, mismatched invoices, or failed audits.
// Incorrect: using double for currency
double price = 19.99;
double total = price * 3;
Console.WriteLine(total); // Output: 59.969999999999999
// Correct: using decimal
decimal priceDec = 19.99m;
decimal totalDec = priceDec * 3;
Console.WriteLine(totalDec); // Output: 59.97
The difference may seem small, but in financial systems, even a cent matters. Always use decimal for currency to avoid these issues.
Never use float or double
for money. Use decimal to ensure accurate and predictable results.
Arithmetic and Comparison
Floating-point types support all standard arithmetic operations: addition, subtraction, multiplication, division, and modulus. But comparisons can be tricky due to rounding errors.
// Comparison trap
double x = 0.1 + 0.2;
Console.WriteLine(x == 0.3); // False
// Safer approach
bool isClose = Math.Abs(x - 0.3) < 0.00001;
Console.WriteLine(isClose); // True
Instead of checking for exact equality, compare the difference and see if it’s within a small tolerance. This technique is common in scientific and graphics programming.
Default Values and Initialization
Like other value types, floating-point variables have default values:
// Default values
float f; // 0.0f
double d; // 0.0
decimal m; // 0.0m
If you declare a floating-point field in a class without initializing it, it will default to zero. This is useful when you’re accumulating totals or performing calculations.
Literal Formatting and Readability
You can use underscores in numeric literals to improve readability, especially for large or precise values:
// Readable literals
double distance = 1_234_567.89;
decimal salary = 75_000.00m;
These underscores are ignored by the compiler but make your code easier to read and maintain.
Choosing the Right Type
Picking the right floating-point type depends on your use case:
- Use
floatfor graphics, sensors, and approximate values. - Use
doublefor scientific, statistical, or engineering data. - Use
decimalfor financial, accounting, and currency-related data.
Remember, precision matters. Don’t use float just because it’s smaller-if your
application needs accuracy, choose accordingly.
Summary
Floating-point types allow you to represent real numbers in your programs. C# provides three options-float, double, and decimal-each with different precision and range characteristics. Understanding
how they work helps you avoid subtle bugs and write reliable code.
In this article, you learned:
- What floating-point numbers are and why they matter
- The differences between
float,double, anddecimal - How precision affects calculations and comparisons
- Why
decimalis essential for financial applications - How to choose the right type for your scenario
In the next article, we’ll explore Boolean Logic-how to represent true/false values, make decisions, and lay the foundation for control flow in your programs.