one decimals decimales c# decimal

c# - decimals - Decimal-truncar ceros finales



truncate math c# (3)

Me di cuenta de que .NET tiene algún comportamiento funky / no intuitivo cuando se trata de decimales y ceros finales.

0m == 0.000m //true 0.1m == 0.1000m //true

pero

(0m).ToString() == (0.000m).ToString() //false (0.1m).ToString() == (0.1000m).ToString() //false

Sé sobre la necesidad de cumplir con el estándar ECMA CLI. Sin embargo, me gustaría saber si hay una forma integrada de truncar los ceros finales para un valor decimal sin pasar por la representación de cadena (.ToString ("G29") y el truco de volver a analizar funcionaría, pero no es una solución rápida ni elegante) ?

¿Algunas ideas? Muchas gracias.


Creo que lo que necesitas es esto (más detalles en mi respuesta here ):

public static decimal Normalize(decimal value) { return value/1.000000000000000000000000000000000m; }


No me gusta mucho, pero funciona (al menos para un rango de valores) ...

static decimal Normalize(decimal value) { long div = 1; while(value - decimal.Truncate(value) != 0) { div *= 10; value *= 10; } if(div != 1) { value = (decimal)(long)value / div; } return value; }


Use una cadena de formato para especificar la salida de ToString ():

(0.1m).ToString("0.#") -> "0.1" (0.10000m).ToString("0.#") -> "0.1"

Use un "0" en el formato para especificar un dígito o un 0 no significativo, use "#" para especificar un dígito significativo o suprima un 0 no significativo.

Edición: Supongo que aquí está preocupado por la representación visual (cadena) del número; de lo contrario, eliminaré mi respuesta.