gpt4 book ai didi

.NET - 浮点比较

转载 作者:行者123 更新时间:2023-12-03 03:17:49 25 4
gpt4 key购买 nike

直接比较 .net 中的 float (double、float)是否相等并不安全。变量中的 double 值可能会随时间发生非常小的变化。例如,如果将某个对象的变量 num(double) 设置为 0.2,则该对象在内存中等待一段时间后,您可能会发现 num 变成了 0.1999999999999。所以在这种情况下 num == 0.2 将为 false。我对这个问题的解决方案是创建一个属性来对数字进行四舍五入:

double Num
{
get{ return Math.Round(num, 1); }
}

调用Num的get并返回结果后,在比较时(Num == 0.2),这个返回的数字是否会再次变为0.19?虽然不太可能,但能保证吗?

最佳答案

不,我们无法保证。

来自 MSDN - Math.Round :

The behavior of this method follows IEEE Standard 754, section 4. This kind of rounding is sometimes called rounding to nearest, or banker's rounding. It minimizes rounding errors that result from consistently rounding a midpoint value in a single direction.

(强调我的)

要点是 - 它最小化,而不是确保。

<小时/>

在比较浮点类型时,您应该始终针对 epsilon 进行测试 - 一个您不关心的最小值。

示例改编自here :

double dValue = 0.2;

var diff = Math.Abs(num - dValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
{
// treat as equal
}
<小时/>

推荐阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic .

关于.NET - 浮点比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7127114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com