var t = (decimal)((float)decimal.MinValue) falla con error CS0031: Constant value '-7.922816E+28' cannot be converted to a 'decimal' , pero ¿por qué?
decimal. decimal.MinValue es -79228162514264337593543950335m . Se convierte con éxito en float como -79228160000000000000000000000f que es mayor que decimal.MinValue :
(float)decimal.MinValue > decimal.MinValue¿Por qué este valor no se puede convertir? Entiendo que es algo sobre el significado y el exponente, pero ¿qué sucede exactamente? ¿Y cuál es el decimal mínimo que se puede convertir en flotante y luego volver a decimal en C#?
No está imprimiendo la precisión completa del flotante, por lo que no puede ver el valor que está causando que falle.
Si cambia el código de la siguiente manera:
var decMin = (float)decimal.MinValue; Console.WriteLine(decMin.ToString("R")); // "-7.9228163E+28" // Next line throws System.OverflowException: Value was either too large or too small for a Decimal. var dec = (decimal)decMin; El valor de decMin se muestra como -7.9228163E+28 . Para hacer esto más fácil de comparar, reescribámoslo sin el exponente y decimal.MinValue con decimal.MinValue :
decMin = -79_228_163_000_000_000_000_000_000_000 decimal.MinValue = -79_228_162_514_264_337_593_543_950_335 Ahora puede ver que decMin es MÁS NEGATIVO que decimal.MinValue , lo que explica por qué no se convierte.