2010-11-12 30 views
8

Estoy realizando algunos cálculos e insertando el resultado en una base de datos.Redondea los números hacia arriba en lugar de hacia abajo | C#

Mi problema es que las respuestas que obtengo parecen redondearse hacia abajo en lugar de hacia arriba. Esto puede no parecer importante pero en el transcurso de muchas ventas, los centavos comienzan a sumarse.

  Decimal pubCut = rrp * (percentageCutD/100); 
      Decimal retCut = rrp * retailerCut; 
      Decimal edcut = rrp * edpercentage; 

Voy a ser honesto, estoy de basura con las figuras y toda la función de Matemáticas era algo que trataba de evitar en la universidad. ¿Alguien puede decirme cómo puedo conseguir que estas cifras redondeen en lugar de hacia abajo?

+0

¿Puede usted por favor publicar los tipos de 'rrp',' percentageCutD', '' retailerCut' y edpercentage'? – Oded

+0

Disculpas, todas son decimales. – 109221793

+2

"toda la función de matemáticas fue algo que traté de evitar en la universidad". De vuelta a la universidad en ese caso, ya que esta falta de conocimiento te atormentará por el resto de tu vida laboral. – Sjoerd

Respuesta

10

.? utilice Math.Ceiling() método

double[] values = {7.03, 7.64, 0.12, -0.12, -7.1, -7.6}; 
Console.WriteLine(" Value   Ceiling   Floor\n"); 
foreach (double value in values) 
    Console.WriteLine("{0,7} {1,16} {2,14}", 
        value, Math.Ceiling(value), Math.Floor(value)); 
// The example displays the following output to the console: 
//   Value   Ceiling   Floor 
//  
//   7.03    8    7 
//   7.64    8    7 
//   0.12    1    0 
//   -0.12    0    -1 
//   -7.1    -7    -8 
//   -7.6    -7    -8 
4

Su problema es el siguiente

(percentageCutD/100) 

Desde 100 es un int, se llevará a cabo la división entera, por lo que se convierte en 150/100 1. Puede solucionar este problema mediante maksing seguro de que 100 es un número decimal, ya que desea un decimal como resultado en el final. Cambia tu código a.

(percentageCutD/100D) 

Sin embargo, si uno siempre quiere incluso valores como 1,1 hasta 2 redondear, entonces usted tendrá que utilizar Math.Ceiling para lograr esto. Si por algún motivo desea evitar la clase Math (no veo por qué desea hacerlo, puede agregar 1 al resultado y convertirlo a int para redondear eficazmente al entero más cercano.

+0

@ Øyvind Bråthen - La división de enteros solo ocurrirá si 'percentageCutD' también es un Entero. Tal como está, no hay suficiente información en la pregunta. – Oded

+0

si percentageCutD es del tipo double o decimal entonces la devision estará bien –

+0

y luego use Math.Ceiling() para redondear :) – KBoek

1

O, usted podría añadir 0,49 al resultado antes de redondear hacia abajo ... apuesta de techo es el camino correcto a seguir;)

1

Sus porcentajes entrantes probablemente no se suman al 100%. Calcule una de sus fracciones restando la suma de las otras fracciones del total.

var v = 100D; 
var p1 = 33D/100; 
var p2 = 33D/100; 
var p3 = 33D/100; 
var v1 = p1*v; 
var v2 = p2*v; 
var v3 = p3*v; 
var sum = v1 + v2 + v3; 

Desafortunadamente sum es 99 y no 100.

Puede calcular v3 esta forma:

var v3 = v - (v1 + v2); 

o fijar mejor el error de redondeo en los porcentajes entrantes:

1

Ronda numere hasta el número entero más cercano utilizando el método de Techo de System.Math.

Por ejemplo:

Decimal retCut = Math.Ceiling(rrp * edpercentage); 

Por lo tanto, si edpercentage es 5, y es PVP 20.23, el resultado habría redondeado 102 en lugar de 101.15

es eso lo que está buscando?

2

. La función Math.Round de Net utiliza algo comúnmente denominado redondeo banquero que funciona redondeando .5 al entero par más cercano, es decir, 22.5 = 22 y 23.5 = 24. Esto proporciona una distribución más pareja al redondear.

Es también digno de mención el servidor SQL no utiliza el redondeo banqueros

Cuestiones relacionadas