当我转换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
有我的错吗?请帮忙。
谢谢!
这是因为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。