为什么结果不同于这个问题?
-
05-09-2019 - |
题
我碰到这个下面的算术问题。
但结果是不同于正常数学的操作,为什么会这样呢?
double d1 = 1.000001;
double d2 = 0.000001;
Console.WriteLine((d1-d2)==1.0);
解决方案
我想你发现乔恩斯基特的脑筋急转弯页面上的问题吗?这些问题的答案中列出并解释在同一网站上rel="noreferrer">。
有关参考的问题,这里是从该网页复制的答案。
第3)傻算术强>
计算机意味着要善于算术,不是吗?为什么这打印“假”?
double d1 = 1.000001; double d2 =
0.000001; Console.WriteLine((d1-d2)==1.0);
答案:这里所有的值存储为二进制浮点数。虽然1.0可以准确地存储,1.000001实际存储为 1.0000009999999999177333620536956004798412322998046875和0.000001实际存储为 0.000000999999999999999954748111825886258685613938723690807819366455078125。它们之间的区别是不完全1.0,实际上的差别不能被精确任一存储。
其他提示
从MSDN项 一倍。等于:
精确的比较
等方法的应用与 谨慎,因为两个显然 等价值可以不等于 不同精度两个 值。以下的示例报告 双值.3333和 双返回通过分割1 3 不平等的。
...
而不是比较为平等, 一个建议涉及的技术 确定一个可以接受保证金的 差之间的两个价值观(例如 .01%的一个值)。如果的 绝对值差异 两者之间值为小于或 平等的保证金,差异 很可能是由于差异 精密的,因此,值 很可能是平等的。下 如使用这种技术的比较 .33333和1/3,这两个双值 前面的代码如发现 可以不等。
如果你需要做很多的"平等"的比较,这可能是一个很好的想法写一个小帮手的功能或扩展的方法。净3.5比较:
public static bool AlmostEquals(this double double1, double double2, double precision)
{
return (Math.Abs(double1 - double2) <= precision);
}
这可以用以下方式:
double d1 = 1.000001;
double d2 = 0.000001;
bool equals = (d1 - d2).AlmostEquals(1.0, 0.0000001);
看看这个非常类似的问题: C#.NET:它是安全检查浮点值平等对0?
这是因为在计算机基座2做数学,并且因此许多十进制浮点数字不能与数字的有限数量的准确表示。
如果您在应用程序中做这样的算术,对的 decimal
类型应使用
decimal d1 = 1.000001M;
decimal d2 = 0.000001M;
Console.WriteLine((d1 - d2) == 1.0M); // evaluates as true
这可能是由于浮点精度的问题,因为它可能是你的结果是不完全的1.0,但也许像1.000000000001
这是因为浮点类型存储使用碱两个不是基10所表示的数字。这有一倍无法存储像0.1的值准确的结果。例如0.1是由单一值0.100000001490116119384765625表示。
您已经使用十进制摆脱错误的。
请参阅什么python文档具有saym的问题是针对两个相同的: