我转换ulong时错了 - >双 - > ulong有大量的

时间:2015-10-29 07:39:33

标签: c#

如果数量很少那么它可以工作,但是数量越大那么它就错了。我的示例代码如下。

    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那么就OK了。
  • 如果val = 90071992549900001,则结果= 90071992549900000
  • 如果val = 90071992549900009,则结果= 90071992549900016

我有什么不对吗?请帮忙。

谢谢!

4 个答案:

答案 0 :(得分:6)

那是因为<style name="AppBaseTheme" parent="android:Theme.DeviceDefault"> <item name="android:popupMenuStyle">@style/PopupMenu</item> <item name="android:actionBarStyle">@style/MyActionBar</item> <item name="actionBarStyle">@style/MyActionBar</item> <item name="android:displayOptions">showHome|useLogo|showTitle</item> </style> <style name="AppTheme" parent="AppBaseTheme"> </style> <style name="MyActionBar"> <item name="android:background">@drawable/gradient3</item> <item name="android:titleTextStyle">@style/MyActionBarTitleText</item> <item name="titleTextStyle">@style/MyActionBarTitleText</item> </style> <style name="PopupMenu" parent="android:Widget.DeviceDefault.ListPopupWindow"> <item name="android:popupBackground">@drawable/gradient1</item> <item name="android:textColor">@color/ed</item> </style> <style name="MyActionBarTitleText" parent="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"> <item name="android:textColor">@color/ed</item> <item name="android:textSize">18sp</item> </style> 拥有64位数据,long的精确度仅为53位。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

来自Msdn

长:有符号的64位整数

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

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

答案 3 :(得分:0)

我的解决方案是使用十进制来包含转换值(而不是双倍)。

感谢您的支持! 仲