为什么模数运算符在c#中不能用于double?

考虑一下:

double x,y; x =120.0; y = 0.05; double z= x % y; 

我试过这个,并期望结果为0,但它出来了0.04933333。

然而,

 x =120.0; y = 0.5; double z= x % y; 

确实给出了0的正确结果。

这里发生了什么?

我尝试了Math.IEEERemainder(double, double)但它也没有返回0。 这里发生了什么?

另外,另外,在C#中查找余数的最合适方法是什么?

由于其存储格式, double s无法完全按照输入或显示的方式存储每个值。 数字的人类表示通常是十进制格式,而double数字则基于双系统。

double ,精确存储120因为它是一个整数值。 但0.05不是。 双精度近似于它可以表示的最接近的数字0.050.521/2 )的幂,因此可以精确存储,并且不会出现舍入误差。

要使所有数字与在十进制系统中输入/显示的方式完全相同,请使用decimal

 decimal x, y; x = 120.0M; y = 0.05M; decimal z = x % y; // z is 0 

你可以这样做:

 double a, b, r; a = 120; b = .05; r = a - Math.floor(a / b) * b; 

这应该有帮助;)

我相信如果你尝试使用decimal相同,它将正常工作。

模数只应与整数一起使用。 剩下的部分来自欧几里德分部。 使用double,您可以获得意想不到的结果。

看到这篇文章

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems可以帮助您理解为什么会得到这些“奇怪”的结果。 浮点数可以具有特定的精度。 只需尝试这些查询并查看结果:

基础2中0.5

基础2中0.05