|
|
1
82
由于计算机如何存储浮点值,这是一个标准问题。在这里搜索“浮点问题”,你会发现大量的信息。
简言之,“浮点数/双点数不能存储
您可以尝试使用
你想知道原因: float/double存储为二进制分数,而不是十进制分数。举例说明:
1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2
计算机以同样的方式存储浮点数,除了使用基数
1 * 21 + 0 * 20 + 0 * 2-1 + 1 * 2-2
现在,您可能知道有些数字不能用十进制表示法完全表示。例如,
由于二进制表示法不能精确地存储它,所以它是以四舍五入的方式存储的。因此你的问题。 |
|
|
2
34
将double与另一个值进行比较的问题是double是近似值,而不是精确值。所以当你设定
您应该检查差异是否小于定义的最小差异(公差),而不是检查是否相等。比如:
|
|
|
3
15
你需要结合
您可以使用以下扩展方法
因为很少在double上调用方法,除了
然后你可以比较
|
|
|
4
10
由于四舍五入的原因,比较浮点数并不总是能够精确地完成。比较
计算机真的比较
由于浮点数在机器上的表示方式不同,因此不能精确地重新表示模拟结果。因此,得到一些非零值,条件的计算结果为
克服这种比较
|
|
|
5
5
从 documentation :
…
因此,如果您真的需要双人间,您应该使用文档中描述的技术。 如果可以,将其更改为十进制。 会慢一点 但是你不会遇到这种问题。 |
|
|
6
3
double和double是相同的。 为此,请参见 http://www.yoda.arachsys.com/csharp/floatingpoint.html . 简言之:“double”不是一个精确的类型,“x”和“0.1”之间的细微差别会使它消失。 |
|
|
7
3
由于舍入和内部表示问题,浮点值的精确比较并不总是有效。 尝试不精确的比较:
另一种选择是使用十进制数据类型。 |
|
|
8
2
使用
|
|
|
9
2
从Java代码库中获取提示,尝试使用
此谓词应返回
|
|
|
10
1
|
|
|
11
1
double(在某些语言中称为float)由于舍入问题而充满问题,只有在需要近似值时才是好的。 decimal数据类型执行所需的操作。 因为引用decimal和decimal在.NET C中是相同的,double和double类型也是相同的,它们都引用相同的类型(如您所见,decimal和double非常不同)。 请注意,decimal数据类型有一些相关的成本,因此在查看循环等时要小心使用它。 |
|
12
0
一般来说: 在大多数情况下,双重表示已经足够好了,但在某些情况下可能会惨遭失败。如果需要完全精确(如在财务应用程序中),请使用十进制值。 双精度数的大多数问题不是直接比较的结果,它通常是几个数学运算的累积结果,这些运算由于舍入和分数错误(尤其是乘法和除法)而以指数形式干扰值。 如果代码是:
它不应该失败,这是简单的失败,如果x值是通过更复杂的方法或操作计算出来的,那么调试器使用的toString方法很有可能使用智能舍入,也许您也可以这样做(如果风险太大,请返回使用小数):
|
|
|
13
0
我发现一个很酷的方法就是
如你所说,现在我们可以用这样的东西
用法:
而:
我在多个案例中都试过,而且效果很好。 |
|
|
14
0
浮点数表示法是众所周知的不准确(因为浮点数在内部存储的方式),例如x实际上可能是0.0999999999或0.10000001,并且您的条件将失败。如果您想确定浮点数是否相等,您需要具体说明它们是否在某个公差范围内相等。 即
|
|
|
15
-7
大多数以上的方法或遵循愚蠢的扩展方法!
|