c# - 将 double 转换为 long 更改值
问题描述
我注意到,当要转换的数字很大double
时,从to的转换会long
改变值,即使它远低于a的最大值。例如,有人可以向我解释为什么这种转换不能按预期工作:long
Convert.ToInt64(600000000000040000d)
// Return => 600000000000039936
Convert.ToInt64(600000000000040000L)
// Return => 600000000000040000
这在我的公式中造成了一些麻烦......谢谢。
解决方案
好吧,double
只有尾数(有关52
详细信息,请参见https://en.wikipedia.org/wiki/Double-precision_floating-point_format);这就是为什么可以表示精确的整数值高达. 然而,double
2**53 - 1 == 9007199254740991
600000000000040000 > 9007199254740991
这就是为什么舍入错误是不可避免的:
double d = 600000000000040000d;
long l = (long)d;
double d2 = l;
Console.WriteLine($"{d:r} : {l} : ({d == d2 ? "Equal" : "Different"})");
结果:
6.0000000000004E+17 : 600000000000039936 : Equal
您可以尝试decimal
代替double
(尤其是如果您正在处理财务数据):
decimal d = 600000000000040000m; // m suffix
long l = (long)d;
decimal d2 = l;
Console.WriteLine($"{d} : {l} : ({d == d2 ? "Equal" : "Different"})");
结果:
600000000000040000 : 600000000000040000 : Equal