C# 转换ulong时出错->;双->;大数乌龙

C# 转换ulong时出错->;双->;大数乌龙,c#,C#,若数字很小,那个么它就起作用了,但若数字较大,那个么它就错了。下面是我的示例代码 public void TestZZZZZZZZZ() { ulong val = ulong.MaxValue; // val = 18446744073709551615 string s = string.Format("{0}", val); double d = Convert.ToDouble(s); ulong re

若数字很小,那个么它就起作用了,但若数字较大,那个么它就错了。下面是我的示例代码

    public void TestZZZZZZZZZ() 
    {
        ulong val = ulong.MaxValue;  // val = 18446744073709551615
        string s = string.Format("{0}", val);

        double d = Convert.ToDouble(s);
        ulong result = ((ulong)d;  // result = 0 <-- WRONG

        Assert.AreEqual(val, result);
    }
public void testzzz()
{
ulong val=ulong.MaxValue;//val=18446744073709551615
字符串s=string.Format(“{0}”,val);
双d=转换为双d;

ulong result=((ulong)d;//result=0这是因为
long
保存64位数据,而
double
的有效精度仅为53位。

double的精度为16位。因此,测试您的数字是否有16位

ulong val = 1234567890123456; // 16 digits
double d = val;
ulong result = (ulong)d;

Console.WriteLine(val == result); // prints true
在此之后,您将失去精度

ulong val = 12345678901234567; // 17 digits
double d = val;
ulong result = (ulong)d;

Console.WriteLine(val == result); // prints false
发件人:

长:有符号64位整数

双精度:64位浮点(15-16位精度)

所以结果不一样。 因此,如果您只有16位数字,那么断言就可以了。
就像M.kazem Akhgary回答一样。

我这里的解决方案是使用十进制包含转换值(而不是双精度)

谢谢你的支持! Trong.

很抱歉手头没有C#。这听起来像是精度问题。您能否尝试在测试代码中使用“十进制”而不是“双精度”,并告诉我们它是否可以解决?根据MSDN,双精度()只有15-16位精度,而十进制()达到28-29位有效数字。