当我转换ulong时出错->;双->;数量大的ulong

本文关键字:gt ulong 出错 转换 | 更新日期: 2023-09-27 18:19:47

如果数字较小则有效,但如果数字较大则错误。下面是我的示例代码。

    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);
    }

部分测试数据结果:

  • 如果val=1229,则正常
  • 如果val=90071992549900000,则表示正常
  • 如果val=90071992549900001,则结果=90071992649900000
  • 如果val=90071992549900009,则结果=9007199254.900016

有我的错吗?请帮忙。

谢谢!

当我转换ulong时出错->;双->;数量大的ulong

这是因为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

来自Msdn:

长:有符号64位整数

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

所以结果是不一样的。所以,如果你只有16位数字,你的断言是可以的。就像M.kazem Akhgary的回答。

我的解决方案是使用decimal来包含用于转换的值(而不是双精度)。

感谢您的支持!Trong。