在C#中使用Math.Ceiling处理整数

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,因为它需要一个double。但是,我认为我需要使用decimal来进行计算。我做错了什么?如何执行这个基本数学运算?


2
你可以通过使用 int 除法来获取floor。如果文件大小不能被块大小整除(使用模运算符),则可以添加1。 - Damien_The_Unbeliever
@Damien_The_Unbeliever:把那个作为答案发布,比其他所有发布的内容都更有意义。 - Dan Puzey
4个回答

10

使用整数运算:

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

请注意,文件大小应该是long类型,传输大于2GB的文件并不罕见。


为那位摆脱了所有愚蠢的类型转换的人欢呼。 - Dan Puzey

3
如果您想使用Math.Ceiling,您可以将result转换为双精度浮点数。
int packetCount = Math.Ceiling((double)result); 

0

我不确定你的确切错误是什么,但似乎在使用Math.Ceiling时需要将packetCount转换为整数:

int chunkSize = 524288;
int fileByteCount = 569344;
decimal result = ((decimal)(fileByteCount)) / ((decimal)(chunkSize));
int packetCount = Convert.ToInt32(Math.Ceiling(result));

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接