c# - C#中的双重比较精度损失,加减 double 时发生精度损失

标签 c# double precision

刚开始学习 C#。我计划将它用于繁重的数学模拟,包括数值求解。问题是我在加减 double 以及进行比较时会出现精度损失。代码及其返回的内容(在注释中)如下:

namespace ex3
{
    class Program
    {
        static void Main(string[] args)
        {

            double x = 1e-20, foo = 4.0;

            Console.WriteLine((x + foo)); // prints 4
            Console.WriteLine((x - foo)); // prints -4
            Console.WriteLine((x + foo)==foo); // prints True BUT THIS IS FALSE!!!
        }
    }
}

非常感谢任何帮助和说明!

令我困惑的是 (x + foo)==foo 返回 True

最佳答案

查看 double 的 MSDN 引用:https://msdn.microsoft.com/en-AU/library/678hzkk9.aspx

它指出 double 的精度为 15 到 16 位。

但是 1e-204.0 之间的数字差异是 20 位。尝试在 4.0 中添加或减去 1e-20 的行为仅仅意味着 1e-20 丢失,因为它不适合在 15 到 16 位精度内。

因此,就 double 而言,4.0 + 1e-20 == 4.04.0 - 1e-20 == 4.0 .

关于c# - C#中的双重比较精度损失,加减 double 时发生精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918595/

相关文章:

c# 在导出 DLL 时隐藏类成员

c - 对于相同的参数,函数的行为不同

java - 如何避免 double 舍入到 0

precision - 避免精度损失的最佳算法?

c# - Azure 队列 : Unable to read cloud queue messages. AsString 和 AsBytes 属性抛出 System.ArgumentException

c# - 我们需要检查 Exchange 上的哪些设置以避免抛出 ServiceRequestException?

c# - 如何从静态类引发自定义事件

c# - Visual Studio 如何在调试期间显示 System.Double?

java - 在不损失精度的情况下划分两个数字

C float 每次执行都会改变 %d 个值