C# 双类型连接字符串或转换为字符串时的奇怪行为

C# 双类型连接字符串或转换为字符串时的奇怪行为,c#,string,double,tostring,string-concatenation,C#,String,Double,Tostring,String Concatenation,我在项目中有记录功能,可以比较对象值并显示差异,但我有一个场景,我有双数据类型的纬度和经度值,但当我将其与字符串连接或将其转换为字符串时,我得到了奇怪的行为,因为它在两个变量中显示相同的值,这完全不是这是可以理解的 代码如下: double value1 = -6.2845230102539063; double value2 = -6.2845230102539098; if (!object.Equals(value1, value2)) {

我在项目中有记录功能,可以比较对象值并显示差异,但我有一个场景,我有双数据类型的纬度和经度值,但当我将其与字符串连接或将其转换为字符串时,我得到了奇怪的行为,因为它在两个变量中显示相同的值,这完全不是这是可以理解的

代码如下:

double value1 = -6.2845230102539063;
double value2 = -6.2845230102539098;
        if (!object.Equals(value1, value2))
        {
            var result = value2 + " to " + value1;
            Console.WriteLine(result);
        }

        Console.ReadLine();
预期产出: -6.2845230102539098至-6.2845230102539063

实际产量: -6.28452301025391至-6.28452301025391

这里是小提琴演示:


这里发生了什么?

这在@LukeH的“为C#中的输出设置双精度格式”中有说明:

问题是.NET总是将
double
四舍五入到15 应用格式之前的小数位数,无论 精度由您的格式要求,不考虑精确的小数点 二进制数的值

使用该答案中链接的DoubleConverter类,我们得到

var x = -6.2845230102539063;
var y = -6.2845230102539098;

Console.WriteLine(x == y);
Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(DoubleConverter.ToExactString(x));
Console.WriteLine(DoubleConverter.ToExactString(y));
哪张照片

False
-6.28452301025391
-6.28452301025391
-6.28452301025390625
-6.284523010253909802713678800500929355621337890625
也可以使用G17格式规范

Console.WriteLine(x.ToString("G17"));
Console.WriteLine(y.ToString("G17"));
这会给你

-6.2845230102539063
-6.2845230102539098
从MSDN:

Double的精度为15-16位。你已经超过了限制您应该改用十进制。有关详细信息,请参见此处:

发件人:

'默认情况下,返回值仅包含15位精度,但内部最多保留17位。'


因此,它知道它们的大小不同,但不会以这种方式显示。

双精度值最多有15位十进制数字,您可以参考详细说明。

您是否尝试过十进制数据类型。它给你一个数字的精确表示……我想是银行和股票市场。您可以将尾数减少到一定的长度(可能是18)。

值刚刚舍入可能是由于var的大小限制!是的,它看起来像是精度问题,但我不确定,因为它支持16位感知。当我调试和检查它时,它显示正确,但当连接它时,它显示奇怪。这个答案不完全准确,因为
value1!=值2