C# 数学,全数字地板

C# 数学,全数字地板,c#,math,C#,Math,我用数学地板法来计算数字a在数字b中能出现多少次。在此具体示例中,变量使用以下值: double a = 1.2; double b = 0.1; double c = Math.Floor(a / b) * b; 这将返回c=11,而不是我认为会返回的c=12。我想这和舍入有关,但我怎样才能让它正常工作呢?当我将数字a提高到1,21时,它返回12。代码的结果是1.1。 我假设您想要获得1.2。 你需要使用 double c=数学上限(a/b)*b; double和float的内部表示方

我用数学地板法来计算数字a在数字b中能出现多少次。在此具体示例中,变量使用以下值:

double a = 1.2; 

double b = 0.1;

double c = Math.Floor(a / b) * b;

这将返回c=11,而不是我认为会返回的c=12。我想这和舍入有关,但我怎样才能让它正常工作呢?当我将数字a提高到1,21时,它返回12。

代码的结果是
1.1
。 我假设您想要获得
1.2
。 你需要使用

double c=数学上限(a/b)*b;

double
float
的内部表示方式对许多数字来说都不够精确,这意味着
a
可能不完全是
1.2
(但是,比如说,1.199999999…)和
b
不完全是
0.1

如果您想要精确的精度,对于没有误差范围(如货币)的数量,请使用
decimal

看看Math.Floor是如何工作的。。基本上,它是四舍五入的

我的猜测是,使用double时,实际上不会得到12作为除法(尽管这似乎是可行的:
double d=a/b;//d=12

Solal指出了同样的问题,并给出了关于小数点的好建议:)

以下是小数的情况:

decimal a = 1.2m; 
decimal b = 0.1m;
decimal c = Math.Floor(a / b) ; // c =12

即使是
decimal
也不能给出“精确的精度”。如果是这样,那么下面的代码将打印“70”,但它会打印“69”:
Console.WriteLine(数学地板(10m/(1m/7m))它没有无限的精度,因为这需要无限的内存,但它对它所能表示的内容有精确的精度,即所有符合其28位小数的内容。好的,我将尝试小数。然而,也许还有其他方法可以解决我的问题。我有的是一段东西。这个物体有一个最小的部分,可以分成,比如说0.1米。所以如果我得到1.19m,我需要返回1.1m。当我得到1.2m,那么1.2m是正确的结果。所以小数有帮助。谢谢!好的,我试试小数。然而,也许还有其他方法可以解决我的问题。我有的是一段东西。这个物体有一个最小的部分,可以分成,比如说0.1米。所以如果我得到1.19m,我需要返回1.1m。当我得到1.2m,那么1.2m是正确的结果。