我在项目中有记录功能,比较对象值并显示差异,但我有一个情绪,我在双数据类型中有纬度和经度值但是当我用字符串连接它或将其转换为字符串时我会得到奇怪的行为,因为它在两个变量中显示相同的值,这完全不可理解它是如何发生的。
以下是代码:
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
这是 DEMO FIDDLE :
https://dotnetfiddle.net/0XM3Da
这里发生了什么?
答案 0 :(得分:3)
来自MSDN:http://msdn.microsoft.com/en-us/library/678hzkk9.aspx
Double的精度为15-16位。你已经超过了这个限制。 您应该使用十进制。有关详细信息,请参阅此处:Can C# store more precise data than doubles?
答案 1 :(得分:2)
@ LukeH的answer至"格式化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
答案 2 :(得分:0)
来自:http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx
'默认情况下,返回值仅包含15位精度,但内部最多保留17位数。'
所以它知道它们的大小不一样,但不会那样显示它们。
答案 3 :(得分:0)
Double值最多包含15位小数的精度,您可以参考详细说明http://msdn.microsoft.com/zh-cn/library/system.double(v=vs.110).aspx
答案 4 :(得分:0)
您是否尝试过十进制数据类型。它为您提供了数字的精确表示......对于银行和股票市场我认为。你可以将尾数减少到一定的长度(可能是18)。