Your float cannot be stored as 630948893921274879, but rather the closest analog, 630948893921274880. Taking the log of base 2, lg(630948893921274879) is between 59 and 60. As such, the spacing between numbers is 2^(59-52) = 2^7 = 128. That means any number between 2^59 and 2^60 will be rounded to the nearest multiple of 128.
Explanation: A float (any size, not just 64) is not one number, but 3 numbers multiplied together. For a 64 bit float: The first number is the sign, 1 bit long. The second number is the exponent, 11 bits long. The final number is the significand (AKA mantissa, fraction, and a few other names), 52 bits long. The final number is then -1^sign * 2^exponent * 1.significand. 1.significand will equal a number between 1 and (almost) 2. This means, every time you get to a multiple of 2, the exponent will increase and the significand will reset. Since the exponent increases, the accuracy of the numbers you get will decrease by half, as the most minor increase in significand will now be twice as large. Your number just happens to be at the point where the smallest change in the significand results in an increase of 128; because of this, your number will be rounded to the nearest multiple of 128. As such, it is not the conversion of float64 to int that is causing the issue, but float64 itself.