2016-11-18 7 views
2

数学演算によってbyteからdoubleへの変換を実行すると、予想通りの結果が得られました。 数値の変更を元に戻すために同じ数学演算を実行すると、doubleタイプを保持している限り正しい値が得られます。 しかし、最後に、私は戻ってbyte値に変換結果をdouble結果を変換します。これは、一部だけbyte値の場合の1ダブルからバイト型への変換エラー

で間違っています。

厳密なプロセス:

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);  

することはできいずれかのキャスト(10進数)または値の後ろに "M" を使用します。

+1

私はあなたにstackoverflowの別のトピックへのリンクを与えました - これはもう少し詳しく説明します - 小数は問題を解決します – TripleEEE

0

byte dbb = (byte)db;の代わりに、byte dbb = (byte)Math.Round(db);で明示的な丸めを使用します。

関連する問題