在C#中使用带有int的Math.Ceiling

时间:2012-08-10 13:18:55

标签: c# double decimal

我正在尝试获取一个文件并将其拆分为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。但是,我认为,我需要使用小数来进行数学运算。我究竟做错了什么?我该如何进行基本的数学运算?

4 个答案:

答案 0 :(得分:8)

使用整数数学:

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

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

答案 1 :(得分:3)

如果您想使用result

,则可以将Math.Ceiling转换为双精度版
int packetCount = Math.Ceiling((double)result); 

答案 2 :(得分:0)

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

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

答案 3 :(得分: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;