Cor*_*box 3 c# double type-conversion
我注意到,从转换double到long 改变的值时,要转换的数量是很大,即使是远低于最大值的long。例如,有人可以解释为什么这种转换不能按预期工作:
Convert.ToInt64(600000000000040000d)
// Return => 600000000000039936
Convert.ToInt64(600000000000040000L)
// Return => 600000000000040000
Run Code Online (Sandbox Code Playgroud)
这给我的公式带来了一些麻烦......谢谢。
那么,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)