将 double 转换为 long 更改值

Cor*_*box 3 c# double type-conversion

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

Convert.ToInt64(600000000000040000d)
// Return => 600000000000039936
Convert.ToInt64(600000000000040000L)
// Return => 600000000000040000
Run Code Online (Sandbox Code Playgroud)

这给我的公式带来了一些麻烦......谢谢。

Dmi*_*nko 5

那么,double尾数52(见https://en.wikipedia.org/wiki/Double-precision_floating-point_format了解详细信息); 这就是为什么double可以表示精确的整数值高达2**53 - 1 == 9007199254740991. 然而,

 600000000000040000 > 9007199254740991
Run Code Online (Sandbox Code Playgroud)

这就是为什么舍入错误是不可避免的:

  double d = 600000000000040000d;

  long l = (long)d;

  double d2 = l;

  Console.WriteLine($"{d:r} : {l} : ({d == d2 ? "Equal" : "Different"})");
Run Code Online (Sandbox Code Playgroud)

结果:

  6.0000000000004E+17 : 600000000000039936 : Equal
Run Code Online (Sandbox Code Playgroud)

您可以尝试decimal代替double(特别是如果您正在处理财务数据):

  decimal d = 600000000000040000m; // m suffix

  long l = (long)d;

  decimal d2 = l;

  Console.WriteLine($"{d} : {l} : ({d == d2 ? "Equal" : "Different"})");
Run Code Online (Sandbox Code Playgroud)

结果:

  600000000000040000 : 600000000000040000 : Equal
Run Code Online (Sandbox Code Playgroud)