Ну, 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