Làm tròn (số tiền) trong C# ? [Archive] – Cộng đồng C Việt

View Full Version : Làm tròn (số tiền) trong C# ?

luxubu

Trong Excel có hàm ROUND để làm tròn rất hay, ví dụ ROUND(384650,-3) sẽ cho ra 385000 (làm tròn đơn vị K).
Trong C# làm sao để làm đc tương tự nhỉ ?
Thanks

linhgl88

Math.Round();

của Bạn đó ^^!

cchangkhongayngo

Math.Round(); rất hạn chế trong vụ này:cool:

Làm tròn tiền là làm tròn ở mức 500 hay 1000 trong thanh toán!!

mrfour.it

hi. Nếu không ổn như ý thì bạn viết thêm cái hàm giống kiểu access. trong đó dùng mấy cái hàm round coi

luxubu

Math.Round();

của Bạn đó ^^!

mình cũng thử Math.Round rồi mà ko đc như ý 🙁

FlyingFox

Bạn dùng function dưới đây thữ xem

static double Round(double value, int digits)
{
if (digits >= 0) return Math.Round(value, digits);

double n = Math.Pow(10, -digits);
return Math.Round(value / n, 0) * n;
}

static decimal Round(decimal d, int decimals)
{
if (decimals >= 0) return decimal.Round(d, decimals);

decimal n = (decimal)Math.Pow(10, -decimals);
return decimal.Round(d / n, 0) * n;
}

linhgl88

mình cũng thử Math.Round rồi mà ko đc như ý 🙁

oh,sr bạn!! Mình tưởng là làm tròn như bt ^^! Ai dè làm tròn tiền!! Bạn thử làm theo cái funtion của bạn FlyingFox thử nhé ^^!

cchangkhongayngo

mình cũng thử Math.Round rồi mà ko đc như ý 🙁

Để mai vô nha trang mình sẽ xử cho bạn!!! Ok hết!

Đối với cái này fuction only three line…

Code mình nhiều cái khủng lắm keke(:))Y(:DY(:D

Đang ở nhà sài laptop+dcom của bà chị(:=(|)(:=(|)

VoTichSu

Excel là một công cụ spreadsheet. Gốc của nó từ kế toán tài chính cho nên nó có nhiều tiện nghi hổ trợ con số tiền.

Muốn làm tương tự thì đặt ra mấy cái extension methods cho int, int64 (thường thì cỡ int64 mới chứa nổi tiền Việt)

Lên mạng tìm từ khóa này, hoăc vào MSDN.

luxubu

oh,sr bạn!! Mình tưởng là làm tròn như bt ^^! Ai dè làm tròn tiền!! Bạn thử làm theo cái funtion của bạn FlyingFox thử nhé ^^!

Mình có thử rồi nhưng cũng ko OK, ví dụ phép toán của mình là:

soTien =(int)((double)luong * (double)(luongCB / 26) * (double)0.75/100 * soNgayTK);

Với luong = 2.65, luongCB = 730000, soNgayTK = 6 sẽ cho ra kết quả 334806, giờ mình muốn làm tròn đến đơn vị K thành 335000, loay hoay mãi chỗ này mà chưa đc 🙂

FlyingFox

Thì bạn viết như sau là được mà:

double Round(double value, int digits)
{
if (digits >= 0) return System.Math.Round(value, digits);

double n = System.Math.Pow(10, -digits);
return System.Math.Round(value / n, 0) * n;
}

private void button1_Click(object sender, System.EventArgs e)
{
double luong = 2.65;
double luongCB = 730000;
int soNgayTK = 6;

double soTien = Round(luong * (luongCB / 26) * 0.75 * soNgayTK, -3);
}

seekill

Mình có thử rồi nhưng cũng ko OK, ví dụ phép toán của mình là:

Với luong = 2.65, luongCB = 730000, soNgayTK = 6 sẽ cho ra kết quả 334806, giờ mình muốn làm tròn đến đơn vị K thành 335000, loay hoay mãi chỗ này mà chưa đc 🙂

Bạn chia cho 1000 lấy sau dấu phảy 1 số, sau đó làm tròn Round hoặc chắc hơn dùng Math.Ceiling (làm tròn kịch trần :D)

Làm tròn xong bạn nhân 1000 lên nữa là ok

luxubu

Hàm của pac FlyingFox có vẻ ok đấy, nhưng tiện các pac xem giúp mình cái công thức mới, kết quả ra linh tinh hết cả. code phần tính toán như sau:

int luongCB = Convert.ToInt32(txtMucLuong.Text); // cai nay = 730000
int soNgayTK = 0;
double luong;
double soTien;
// phan tính soTien ứng với mỗi giá trị của luong, soNgayTK
soTien = luong * luongCB / 26 * 0.0075 * soNgayTK;

ko hiểu sao lúc nó ra đúng,, lúc ra sai.
Ví dụ luong = 2,65, soNgayTK = 6 thì nó ra 334817 -> đúng
nhưng thử luong = 3,9, soNgayTK = 6 nó ra 49275 -> sai, phải là 492750 mới đúng
tương tự luong = 4.9, soNgayTK = 1 nó ra 1031 -> sai, phải là 103100 mới đúng

VoTichSu

Số tiền nếu chỉ cần làm tròn thành 1000 hay 500 thì nên dùng con tính số nguyên

Lý do: Làm tròn số thực mới khó. Chứ số nguyên thì dễ lắm.

// hàm này chỉ làm tròn số int, muốn dùng float hay double phải chỉnh code

long RoundingTo(long myNum, long roundTo)
{
if (roundTo <= 0) return myNum;
return (myNum + roundTo / 2) / roundTo * roundTo;
}

long RoundingTo(long myNum, int roundTo)
{
return RoundingTo(myNum, (long)roundTo);
}

int RoundingTo(int myNum, int roundTo)
{
return (int)RoundingTo((long)myNum, (long)roundTo);
}

VD

long so, tronToi1000, tronToi500;
so = 123456789;
tronToi1000 = RoundingTo(so, 1000); // 123457000
tronToi500 = RoundingTo(so, 500); // 123457000
so = 123456720;
tronToi1000 = RoundingTo(so, 1000); // 123457000
tronToi500 = RoundingTo(so, 500); // 123456500
so = 123456350;
tronToi1000 = RoundingTo(so, 1000); // 123456000
tronToi500 = RoundingTo(so, 500); // 123456500

luxubu

Thanks VoTichSu, mình thử thấy ok lắm, nhưng ko hiểu sao cái công thức tính toán của mình luôn bị sai khi phần thập phân của lương chỉ có 1 con số
Công thức đã sửa lại là;

int soNgayLK;
long soTien;
int luongCB = Convert.ToInt32(txtMucLuong.Text); // cái này = 730000
int soNgayTK = 0;
double luong;
soTien = (long)(luong * luongCB / 26 * 0.0075 * soNgayTK);

Ví dụ soNgayTK =2, luong = 2.60 sẽ tính đúng là 109500, nhưng nếu luong = 2.6 thì kết quả lại ra 10950 (bị mất một số hàng đơn vị) 🙁

Đây là công thức gốc trong excel

=ROUND(C14*730000/26*75%*F14,-3)

trong đó C14 = luong, F14 = soNgayTK, trong excel thì C14 = 2.60 hay 2.6 vẫn cho 1 kết quả đúng 🙁

VoTichSu

Nếu dùng đúng code của bạn thì sẽ ra soTien = 1095

Nếu sửa 0.0075 thành 0.75 (thực trị của 75%) thì cả hai cách luong = 2.6 hay 2.60 cũng đều ra soTien = 109500

thanhtamsk

Mình có thử rồi nhưng cũng ko OK, ví dụ phép toán của mình là:

Với luong = 2.65, luongCB = 730000, soNgayTK = 6 sẽ cho ra kết quả 334806, giờ mình muốn làm tròn đến đơn vị K thành 335000, loay hoay mãi chỗ này mà chưa đc 🙂

cậu thử cái này
int a = luong *luongCB *soNgayTK ;
int d1 = a / 1000;
int b = a % 1000;
int c = 0;
int t = b / 100;
if (t >= 7)
{
c = (d1 + 1) * 1000;
}
else c = d1 * 1000;
t>=? tùy ý bạn muốn làm tròn bao nhiêu ở đây tớ làm tròn tới 700 nếu >=700 sẽ + thêm 1000