首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我将ulong ->双-> ulong转换为大数时出错

当我将ulong ->双-> ulong转换为大数时出错
EN

Stack Overflow用户
提问于 2015-10-29 07:39:32
回答 4查看 1.1K关注 0票数 0

如果是小数,那么它就起作用了,但是对于较大的数字,它是错误的。下面是我的示例代码。

代码语言:javascript
复制
    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,则结果= 90071992549900000
  • 如果val = 90071992549900009,则结果= 90071992549900016

我有什么问题吗?请帮帮忙。

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2015-10-29 07:44:41

这是因为long拥有64位数据,而double的重要精度只有53位。

票数 6
EN

Stack Overflow用户

发布于 2015-10-29 07:48:52

双精度为16位。所以测试你的号码16位数。

代码语言:javascript
复制
ulong val = 1234567890123456; // 16 digits
double d = val;
ulong result = (ulong)d;

Console.WriteLine(val == result); // prints true

在此之后,你将失去精确性。

代码语言:javascript
复制
ulong val = 12345678901234567; // 17 digits
double d = val;
ulong result = (ulong)d;

Console.WriteLine(val == result); // prints false
票数 2
EN

Stack Overflow用户

发布于 2015-10-29 07:50:51

来自Msdn

Long:有符号的64位整数

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33408410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档