2010-11-12 14 views
8

Sto eseguendo alcuni calcoli e inserendo il risultato in un database.Arrotonda numeri al posto di giù | C#

Il mio problema è che le risposte che sto ottenendo sembrano arrotondare piuttosto che aumentare. Questo potrebbe non sembrare importante ma nel corso di un sacco di vendite, i centes iniziano a sommarsi !!

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

Sarò onesto, io sono rifiuti con figure e l'intera funzione matematica era qualcosa ho cercato di evitare in un college. Qualcuno può dirmi come posso ottenere queste cifre per arrotondare anziché scendere?

+0

Potete prega di inviare i tipi di 'rrp',' percentageCutD', '' retailerCut' e edpercentage'? – Oded

+0

Ci scusiamo, sono tutti decimali. – 109221793

+2

"l'intera funzione matematica era qualcosa che ho cercato di evitare al college". Torna al college in quel caso, poiché questa mancanza di conoscenza ti perseguiterà per il resto della tua vita lavorativa. – Sjoerd

risposta

10

.? utilizzare Math.Ceiling() metodo

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

Il tuo problema è questo

(percentageCutD/100) 

Dal 100 è un int, esso deve svolgere divisione intera, in modo che diventi 150/100 1. È possibile risolvere questo problema maksing sicuri che 100 è un numero decimale poiché si desidera un decimale come risultato alla fine. Cambia il tuo codice in

(percentageCutD/100D) 

Tuttavia, se si vuole sempre arrotondare i valori anche come 1,1 fino a 2, allora si dovrà utilizzare Math.Ceiling per raggiungere questo obiettivo. Se per qualche motivo desideri evitare la classe Math (non riesco a capire perché vuoi farlo, puoi aggiungere 1 al risultato e trasmetterlo a un int per arrotondare efficacemente al numero intero più vicino.

+0

@ Øyvind Bråthen - La divisione intero si verifica solo se 'percentageCutD' è anche un numero intero. Così com'è non ci sono abbastanza informazioni nella domanda. – Oded

+0

se percentCutD è di tipo double o decimal la devision andrà bene –

+0

e quindi utilizzare Math.Ceiling() per arrotondare :) – KBoek

1

Oppure, si potrebbe basta aggiungere 0,49 al risultato prima di arrotondamento per difetto ... scommessa soffitto è la strada giusta da percorrere;)

1

Le percentuali in entrata probabilmente non si aggiungono al 100%. Calcola una delle tue frazioni sottraendo la somma delle altre frazioni dal totale.

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; 

Purtroppo sum è 99 e non 100.

È possibile calcolare v3 come questo, invece:

var v3 = v - (v1 + v2); 

O meglio correggere l'errore di arrotondamento nelle percentuali in arrivo:

1

rotonda numero fino al numero intero più vicino utilizzando il metodo Ceiling di System.Math.

Ad esempio:

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

Pertanto, se edpercentage è 5, e RRP è 20.23, il risultato arrotondato sarebbero 102 invece di 101.15

è quello che stai cercando?

2

. La funzione Math.Round di Net utilizza qualcosa che viene comunemente chiamato arrotondamento del banchiere che funziona arrotondando il valore .5 al numero intero pari più vicino, ovvero 22.5 = 22 e 23.5 = 24. Ciò fornisce una distribuzione più uniforme durante l'arrotondamento.

E 'anche interessante notare il server SQL non usa banchieri arrotondamento

Problemi correlati