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