首页 > 解决方案 > 将 double 转换为 long 更改值

问题描述

我注意到,当要转换的数字很大double时,从to的转换会long 改变值,即使它远低于a的最大值。例如,有人可以向我解释为什么这种转换不能按预期工作long

Convert.ToInt64(600000000000040000d)
// Return => 600000000000039936
Convert.ToInt64(600000000000040000L)
// Return => 600000000000040000

这在我的公式中造成了一些麻烦......谢谢。

标签: c#type-conversiondouble

解决方案


好吧,double只有尾数有关52详细信息,请参见https://en.wikipedia.org/wiki/Double-precision_floating-point_format);这就是为什么可以表示精确的整数值高达. 然而,double2**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

推荐阅读