2012-08-03 22 views
14

Ondalık bir '96 .154 'verildiğinde, her zaman 96.16'ya yuvarlandığından nasıl emin olabilirim (96.15 veren 2 ondalık normal yuvarlama yerine).Ondalık nasıl yuvarlanır?

+0

96.16 kadar 96,154 yuvarlak ve aşağı yuvarlamak değil nasıl 96.15? Yuvarlamanın nasıl çalışması gerektiğinin ayrıntılarını belirtmek iyi olur. –

+0

Bu bağlantıya göz atın http://stackoverflow.com/questions/11740989/rounding-decimal-value/11741129#11741129 – sabz23

+0

Bu gerçek ondalıklı mı yoksa çift mi? – ken2k

cevap

16

hacky Kind ama bunu yapmak için çok sezgisel yol:

var val = 96.154M; 

var result = Math.Ceiling(val * 100)/100.0M; 
+0

Dediğiniz gibi en ideali değil ama en iyi çözüm olan –

5

Ben senin Math.Ceiling yöntemle arayan düşünüyorum.

Bunu yapmak için kaç ondalık basamak belirtmek için bunu bir çarpanla birleştirebilirsiniz. Bunun gibi,

public float roundUp(float number, int numDecimalPlaces) 
{ 
    double multiplier = Math.Pow(10, numDecimalPlaces)) 

    return Math.ceiling(number*multiplier)/multiplier; 
} 
6

Sen sonucunda tura kadar değere 0,005 ekleyebilir ve.

+1

dehası gibi görünüyor, ancak her zaman sıfırdan uzaklaşmak istediğinize, negatiflere ne dersiniz? – Jodrell

+0

@Jodrell Sorunun başlığı her şeyin "her zaman" olduğunu söylüyor. Bu arada, negatif sayılar hakkındaki yorumları destekledim. –

+3

Bu değer "96.150" olduğunda işe yaramaz, çünkü "96.16" değerine yuvarlanır, bu yanlıştır, çünkü 96.15 "ifadesi gerekir. – Steven

0

Bir değer ve temel kesir için bir roundUp yönteminin kodu. Sorunuz için kullanmanız gereken temel bölüm 0.05M'dir. Bununla birlikte, yöntem, baz fraksiyonu 0.5M olan diğer yaygın senaryolar için kullanılabilir; Ve bunu örneğin 0.3M'lik bir temel fraksiyon kullanarak ilginç şekillerde uygulayabilirsiniz. Eh ben eğlenceli, bu sorulara cevap vermelidir umut var:

İşte
static decimal roundUp(decimal aValue, decimal aBaseFraction) 
{ 
    decimal quotient = aValue/aBaseFraction; 
    decimal roundedQuotient = Math.Round(quotient, 0); 
    decimal roundAdjust = 0.0M; 
    if (quotient > roundedQuotient) 
    { 
     roundAdjust = aBaseFraction; 
    } 
    return roundAdjust + roundedQuotient * aBaseFraction; 
} 
0

bir RoundUp yönteminin benim sürümüdür, bu can spesifik ondalık

void Main() 
{ 
    Console.WriteLine(RoundUp(2.8448M, 2)); 
    //RoundUp(2.8448M, 2).Dump(); 
} 

public static decimal RoundUp(decimal numero, int numDecimales) 
{ 
    decimal valorbase = Convert.ToDecimal(Math.Pow(10, numDecimales)); 
    decimal resultado = Decimal.Round(numero * 1.00000000M, numDecimales + 1, MidpointRounding.AwayFromZero) * valorbase; 
    decimal valorResiduo = 10M * (resultado - Decimal.Truncate(resultado)); 

    if (valorResiduo < 5) 
    { 
     return Decimal.Round(numero * 1.00M, numDecimales, MidpointRounding.AwayFromZero); 
    } 
    else 
    { 
     var ajuste = Convert.ToDecimal(Math.Pow(10, -(numDecimales + 1))); 
     numero += ajuste; 
     return Decimal.Round(numero * 1.00000000M, numDecimales, MidpointRounding.AwayFromZero); 
    } 
} 
İlgili konular