6

ファイルを取得して、512kb のチャンクに分割しようとしています。チャンクの数を計算するには、いくつかの基本的な計算を行う必要があります。何らかの理由で、データ損失の問題が発生しています。何が間違っているのかわかりません。私は現在持っています:

int chunkSize = 524288;  // 512kb
int fileByteCount = GetFileSizeInBytes();
decimal result = ((decimal)(fileByteCount)) / ((decimal)(chunkSize));
int packetCount = Math.Ceiling(result);   // Doesn't work.

double が必要なため、Math.Ceiling を使用できません。しかし、計算を行うには小数を使用する必要があると思います。私は何を間違っていますか?この基本的な数学演算を行うにはどうすればよいですか?

4

4 に答える 4

9

整数演算を使用する:

int chunkSize = 524288;  // 512kb
int fileByteCount = GetFileSizeInBytes();
int packetCount = (fileByteCount + chunkSize - 1) / chunkSize;

ファイル サイズは実際には長くする必要があることに注意してください。2 ギガバイトを超えるファイルを転送することは珍しくありません。

于 2012-08-10T13:35:14.947 に答える
3

result使用したい場合は、ダブルにキャストできますMath.Ceiling

int packetCount = Math.Ceiling((double)result); 
于 2012-08-10T13:20:50.243 に答える
0

正確なエラーが何であるかはわかりませんが、Math.Ceiling を使用する場合は packetCount を整数に変換する必要があるようです:

int chunkSize = 524288;
int fileByteCount = 569344;
decimal result = ((decimal)(fileByteCount)) / ((decimal)(chunkSize));
int packetCount = Convert.ToInt32(Math.Ceiling(result));
于 2012-08-10T13:22:49.833 に答える
0

丸めの問題です。以下を試してください。

int chunkSize = 524288;  // 512kb 
int fileByteCount = GetFileSizeInBytes(); 
decimal result = (decimal)fileByteCount / (decimal)chunkSize; 
decimal remainder = decimal.Remainder((decimal)fileByteCount, (decimal)chunkSize);
int packetCount = (remainder > 0) ? (int)(result + 1) : (int)result;
于 2012-08-10T13:27:08.460 に答える