2

When performing conversion from byte to double by mathematical operations I've got expected result. Performing the same mathematical operations to reverse the changes in value, results in correct value as long as I keep double type. But when at the end I converts double result back to byte value the conversion results is incorrect by 1.

This is the case only for some byte values.

Exact process:

byte b = 82;                    Console.WriteLine(b);   // initial byte value
double d = (b / 100.0) + 2.00;  Console.WriteLine(d);   // 82 / 100 -> 0.82 + 2.00 -> 2.82  OK
double dt = d - 2.00;           Console.WriteLine(dt);  // 2.82 - 2.0 -> 0.82               OK
double db = dt * 100.0;         Console.WriteLine(db);  // 0.82 * 100 -> 82  (double)       OK
byte dbb = (byte)db;            Console.WriteLine(dbb); // (byte)82 -> 81    ERROR ERROR ERROR
b = Byte.Parse(db.ToString());  Console.WriteLine(b);   // 82 -> "82" and to byte           OK

Why it is happening? The double result does not have any values after comma.

gabr
  • 203
  • 2
  • 8

2 Answers2

2

if you debug your code you will see what is going on:

double d = (b / 100.0) + 2.00; Console.WriteLine(d)// => d = 2.82
double dt = d - 2.00; Console.WriteLine(dt) // => dt = 0.81999999999999984
double db = dt * 100.0; Console.WriteLine(db) // => db = 81.999999999999986
byte dbb = (byte)db; Console.WriteLine(dbb)  //=> dbb = 81, because Byte is cut off after the ","

If you use decimal instead of double it will work out.

See: https://stackoverflow.com/questions/2741903/c-sharp-4-double-minus-double-giving-precision-problems

To make it complete:

decimal d = (b / 100.0m) + 2.00m; Console.WriteLine(d); 
decimal dt = d - 2.00m; Console.WriteLine(dt);  
decimal db = dt * (decimal)100.0; Console.WriteLine(db);  
byte dbb = (byte)db; Console.WriteLine(dbb);      

You can either cast (decimal) or use the "m" behind the value.

Community
  • 1
  • 1
TripleEEE
  • 499
  • 3
  • 11
  • 1
    I gave you a link to another Topic on stackoverflow - this will explain it a little more in detail - decimal will solve your problem – TripleEEE Nov 18 '16 at 09:52
0

Instead of byte dbb = (byte)db; use explicit rounding with byte dbb = (byte)Math.Round(db);.

mrówa
  • 5,671
  • 3
  • 27
  • 39