如何用小数点后两位来做数学运算

本文关键字:两位 运算 小数点 何用 | 更新日期: 2023-09-27 18:16:10

我在这里有这段代码,用于监视字节数组传输的状态。问题是它最后总是一个整数。我每10%更新一次DB中的表,所以知道它何时恰好是10.00%是很重要的,否则每10%就会发生数百次DB调用。

任何想法?我数学很烂:)

double percentageComplete = 0;
percentageComplete = (int)(totalReadCount / (double)fileSize * 100);

如何用小数点后两位来做数学运算

您可能需要考虑另一种更新数据库的方法。测试一个数字是"10%"还是"10.00%"是不可靠的。

相反,测试它何时>该百分比,然后设置一个标志来指示您已经为该百分比完成了数据库更新。

去掉cast,你会看到:

percentageComplete = (int)(totalReadCount / (double)fileSize * 100);

改成:

percentageComplete = (totalReadCount / (double)fileSize * 100);

为什么在计算后要将其强制转换为(int) ?删除(int)强制转换,然后应该就可以了。

下面应该会得到你想要的结果

percentageComplete = (totalReadCount / (double)fileSize * 100);

您正在将double转换为int,因此当然您的结果将是一个整数,该整数削减了尾随小数。所以如果你有double等于8.9会被截断为8 8.1也会被截断为8。所以如果你的10%接近9,你的10%将非常不准确,因为它被切断到8。

对于"精确的"10%,字节不能分割,所以一个近似值是你能得到的最好的。

一个11,111字节长的文件将有111,11字节作为10%,但是计算机读取整个字节,就像如果你有11.111个人,你不能取确切的10%,因为把一个人分成一个人+ 111人的0.11%是不可能的。

所以你通过四舍五入得到最佳近似值。

int fileSize10p = Math.Round((double)fileSize / 10.0); //10% of file size
if(fileSize10p ==  totalReadCount){
  //do something
}