2016-11-18 98 views
2

通過數學運算執行從bytedouble的轉換時,我得到了預期的結果。 只要我保持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結果在逗號後沒有任何值。

回答

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 "," 

如果您使用的小數代替它會工作了。

參見: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

我給你一個鏈接到另一個話題在stackoverflow - 這將解釋它更詳細一點 - 十進制將解決你的問題 – TripleEEE

0

而不是byte dbb = (byte)db;使用與byte dbb = (byte)Math.Round(db);的明確舍入。