Limitar el doble de hasta 3 decimales

Este yo lo que estoy tratando de lograr:

Si un doble cuenta con más de 3 decimales, quiero trunca los decimales más allá de la tercera. (no redonda.)

Eg.: 12.878999 -> 12.878

Si un doble tiene menos de 3 decimales, deje la

Eg.:   125   -> 125
       89.24 -> 89.24

Me encontré con este comando:

double example = 12.34567;
double output = Math.Round(example, 3);

Pero no quiero ronda. De acuerdo con el comando de arriba,
12.34567 -> 12.346

Quiero truncar el valor, de modo que se convierte en: 12.345

InformationsquelleAutor xbonez | 2010-09-28

8 Kommentare

  1. 63

    Dobles no tienen decimales – que no está basada en dígitos decimales para empezar. Usted podría conseguir «el más cercano al doble del valor actual cuando se trunca a tres dígitos decimales», pero aún así no sería exactamente el mismo. Usted sería mejor usar decimal.

    Habiendo dicho que, si es sólo la forma en que el redondeo se realiza ese es un problema, puede utilizar Math.Truncate(value * 1000) /1000; que puede hacer lo que quiera. (Usted no desea redondeo, por los sonidos de la misma.) Todavía potencialmente «peligroso», aunque, como el resultado todavía no realmente sólo tienen tres cifras decimales. Si usted hizo la misma cosa con un valor decimal, sin embargo, sería trabajo:

    decimal m = 12.878999m;
    m = Math.Truncate(m * 1000m) / 1000m;
    Console.WriteLine(m); //12.878

    EDIT: Como LBushkin señaló, debe ser clara entre truncar para pantalla fines (que en general se puede hacer en un especificador de formato) y truncar para los cálculos posteriores (en el que caso de que el anterior debería funcionar).

    • Si el «truncamiento» es sólo para fines de visualización, que puede lograrse cuando el valor se convierte en una representación de cadena. Este preservar la precisión y evitar algunos de los riesgos de intentar realizar decimal precisa manipulación de un número de punto flotante.
    • Verdadero. Depende de lo que se requiere. A veces las empresas realmente quieren los cálculos a realizarse en truncar los valores en cada punto… y a veces es sólo para mostrar. Bueno a punto de salir.
    • por defecto es truncar a 3 decimales?
    • Nada de eso – no estoy seguro de por qué te gustaría pensar que.
    • el fragmento no tiene donde especifica por lo que hizo m de pensar»
    • Es multiplicar por 1000, truncar a entero y dividiendo por 1000. Si los 10000m en cambio, sería a 4 decimales.
    • para mostrar el número específico de n percisio, esta es la forma recomendada? :stackoverflow.com/a/3814295/1875256
    • Para pantalla a los efectos de, sí, muy bien.
    • Su declaración es incorrecta, una doble tiene decimal es un tipo de punto flotante de doble ±5.0 e−324 a ±1.7e308 15-16 dígitos
    • Creo que usted debería leer toda la respuesta. Un doble es un signo, mantisa y exponente, donde el exponente indica el binario cambio; no tiene decimal dígitos. Sí, ese número puede ser representado en decimal, pero eso no es inherente de datos en el valor.

  2. 41

    Yo no puedo pensar en una razón explícita de perder precisión fuera de los fines de la presentación. En ese caso, basta utilizar el formato de cadena.

    double example = 12.34567;
    
    Console.Out.WriteLine(example.ToString("#.000"));
    • La necesito porque estoy valores coincidentes de un archivo XML con los almacenados en una base de datos. Ambas fuentes son llenadas por los diferentes partidos. El que se llena en el Db decide no llenar en algo más de 3 decimales, mientras que el archivo XML a menudo puede tener hasta 8 decimales
    • Y otro posible caso de uso, como el mío, es donde tengo un campo DB que puede demorar de 10 caracteres, pero la forma tiene un lb -> kg de campo cuando un cálculo se lleva a cabo y puede dar un número > 10 caracteres. A veces usted sólo quiere un par de dígitos significativos y no quiere truncar o redondo, pero tiene limitaciones en cuanto a muchas de las figuras que se pueden almacenar. Así que me gustaría downvote el cuestionamiento de este caso de uso, ya que es muy común cuando el almacenamiento de números en un campo DB, no upvote. Por suerte tiene una respuesta útil, así que voy a upvote, en su lugar.
    • ToString redondea el número!
  3. 18
    double example = 3.1416789645;
    double output = Convert.ToDouble(example.ToString("N3"));
    • Yo necesitaba sólo algunos decimales después del ejemplo.Esto ayudó.:)
  4. 7

    Multiplica por 1000, a continuación, utilizar Truncate luego se divide por 1000.

    • Sí tienes razón. Mismo método, pero el doble de sobrecarga frente a decimal.
  5. 5

    Si su propósito en el truncamiento de los dígitos es para mostrar razones, a continuación, sólo, simplemente, utilizar un formato adecuado al convertir la doble cadena.

    Métodos como String.Format() y Console.WriteLine() (y otros) permiten limitar el número de dígitos de precisión de un valor con formato.

    Intentar «truncar» números de punto flotante es desacertado – números de punto flotante no tiene una precisa representación decimal en muchos casos. La aplicación de un enfoque como el escalamiento de la cifra, truncar, y, a continuación, escalando hacia abajo fácilmente podría cambiar el valor a algo muy diferente de lo que esperaba para el «truncado» valor.

    Si usted necesita decimal precisa representaciones de un número que se debe utilizar decimal en lugar de double o float.

  6. 3

    Puede utilizar:

    double example = 12.34567;
    double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
    • Mi única preocupación aquí es que la conversión de tipo int no sólo las rodajas de los dígitos después del decimal, pero restringe el rango del valor de lo que un int puede contener. Un doble puede ser mucho más grande que un int.
  7. 1

    Buenas respuestas anteriores – si usted está buscando algo reutilizables aquí está el código. Tenga en cuenta que usted puede ser que desee comprobar el número de decimales del valor, y esto puede desbordamiento.

    public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
    {
        decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));
    
        return Math.Truncate((power * numberToTruncate)) / power;
    }
  8. 1

    En C lang:

    double truncKeepDecimalPlaces(double value, int numDecimals)
    {
        int x = pow(10, numDecimals);
        return (double)trunc(value * x) / x;
    }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea