通过数学运算执行从byte
到double
的转换时,我得到了预期的结果。
只要保持double
类型,执行相同的数学运算以反转值的变化就会产生正确的值。
但最后,我将double
结果转换回byte
值,转换结果错误为1。
仅适用于某些byte
值。
确切的过程:
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
为什么会这样?
double
结果在逗号后没有任何值。
答案 0 :(得分:2)
如果您调试代码,您将看到正在发生的事情:
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 ","
如果您使用十进制而不是 double ,它将会运作。
请参阅:https://stackoverflow.com/questions/2741903/c-sharp-4-double-minus-double-giving-precision-problems
要完成它:
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);
您可以投射(十进制)或使用值后面的“m”。
答案 1 :(得分:0)
而不是byte dbb = (byte)db;
使用显式舍入byte dbb = (byte)Math.Round(db);
。