6

我正在尝试获取一个文件并将其拆分为 512kb 的块。要计算块的数量,我需要做一些基本的数学运算。出于某种原因,我遇到了一些数据丢失问题。我无法弄清楚我做错了什么。我目前有:

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

我不能使用 Math.Ceiling 因为它需要双精度。但是,我认为,我需要使用小数来计算。我究竟做错了什么?我该如何做这个基本的数学运算?

4

4 回答 4

9

使用整数数学:

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

请注意,文件大小确实应该很,传输大于 2 GB 的文件并不罕见。

于 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 回答