与String连接或转换为String时的双重类型奇怪行为

时间:2014-11-28 05:17:09

标签: c# string double tostring string-concatenation

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

以下是代码:

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

这里发生了什么?

5 个答案:

答案 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)。