slyvain
11/20/2017 - 8:15 AM

Floating points

Some traps to be aware of when dealing with floating point variables.

Gotchas

example 1
double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false
example 2
double a = 0.1;
Console.WriteLine(a + a + a == 0.3); // false
example 3
Console.WriteLine("((double)(1/103.0))*103 < 1 is {0}.", ((double)(1 / 103.0)) * 103 < 1); // true
Console.WriteLine("((float)(1/103.0F))*103 > 1 is {0}.", ((float)(1 / 103.0F)) * 103 > 1); // false
example 4
int fullPrice = 100;
float discount = 0.1F;
Int32 finalPrice = (int)(fullPrice * (1 - discount));
Console.WriteLine("The discounted price is ${0}.", finalPrice); // 89 instead of 90

Declarations

double d = 1;
d = 1d;
d = 1D;
d = 1.2; //double is the default if there's no suffix
d = 1.2d; //The suffix is redundant here
d = .2;
d = 12e-12;
d = 12E-12;
d = 1_234e-1_2; //digit separators are allowed since C# 7

float f = 1;
f = 1f;
f = 1F;
f = 1.2f;
f = .2f;
f = 12e-12f;
f = 12E-12f;
f = 1_234e-1_2f;

decimal m = 1;
m = 1m;
m = 1M;
m = 1.2m;
m = .2m;
m = 12e-12m;
m = 12E-12m;
m = 1_234e-1_2m;

Some more reading about floating points.