2010-09-28 34 views
37

i này những gì tôi đang cố gắng để đạt được:Hạn chế tăng gấp đôi đến 3 chữ số thập phân

Nếu một đôi đã có hơn 3 chữ số thập phân, tôi muốn cắt bất kỳ chữ số thập phân ngoài thứ ba. (Không tròn.)

Eg.: 12.878999 -> 12.878 

Nếu một đôi còn ít hơn 3 thập phân, để lại không thay đổi

Eg.: 125 -> 125 
     89.24 -> 89.24 

Tôi đã xem qua lệnh này:

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

Nhưng tôi không muốn tròn. Theo lệnh được đăng trên đây, 12.34567 -> 12.346

Tôi muốn cắt ngắn giá trị để nó trở thành: 12.345

+0

Xem http://stackoverflow.com/questions/3797342/how-do-i-round-down-a-decimal-to-2 -decimal-places-in-net –

Trả lời

53

đôi không có chữ số thập phân địa điểm - chúng không dựa trên các chữ số thập phân để bắt đầu. Bạn có thể nhận được "giá trị gần nhất với giá trị hiện tại khi cắt ngắn thành ba chữ số thập phân", nhưng nó vẫn sẽ không chính xác như cũ. Bạn nên sử dụng tốt hơn decimal. Đã nói rằng, nếu nó chỉ là cách làm tròn xảy ra đó là một vấn đề, bạn có thể sử dụng Math.Truncate(value * 1000)/1000;có thể làm những gì bạn muốn. (Bạn không muốn làm tròn ở tất cả, bởi những âm thanh của nó.) Nó vẫn còn có khả năng "dodgy" mặc dù, kết quả vẫn sẽ không thực sự chỉ có ba chữ số thập phân. Nếu bạn đã làm điều tương tự với một giá trị thập phân, tuy nhiên, nó sẽ công việc:

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

EDIT: Như LBushkin chỉ ra, bạn phải rõ ràng giữa cắt xén cho hiển thị mục đích (mà thường có thể được thực hiện trong một trình định dạng định dạng) và cắt xén để tính toán thêm (trong trường hợp này ở trên sẽ hoạt động).

+0

yup ... không làm tròn. Tôi sẽ thử cái này. Cảm ơn. – xbonez

+2

+1 để chỉ ra rằng đây là một công việc cho 'thập phân'. –

+4

Nếu "cắt ngắn" chỉ dành cho mục đích hiển thị, có thể đạt được khi giá trị được chuyển thành biểu diễn chuỗi. Điều này sẽ bảo toàn độ chính xác và tránh một số cạm bẫy của việc cố gắng thực hiện thao tác thập phân chính xác của một số dấu phẩy động. – LBushkin

7

Multiply 1000 sau đó sử dụng Truncate sau đó chia cho 1000.

+0

Liên kết bạn muốn là http://msdn.microsoft.com/en-us/library/c2eabd70.aspx –

+0

Có bạn đã đúng. Cùng một phương pháp, nhưng quá tải đôi như trái ngược với thập phân. – Josh

3

Bạn có thể sử dụng:

double example = 12.34567; 
double output = ((double) ((int) (example * 1000.0)))/1000.0 ; 
+0

Mối quan tâm duy nhất của tôi ở đây là chuyển đổi thành int không chỉ cắt các chữ số sau vị trí thập phân mà còn giới hạn phạm vi giá trị thành nội dung có thể chứa. Một đôi có thể lớn hơn nhiều so với một int. –

5

Nếu mục đích của bạn trong cắt bỏ các chữ số là vì lý do hiển thị, sau đó bạn chỉ chỉ cần sử dụng một định dạng thích hợp khi bạn chuyển đổi gấp đôi lên một chuỗi.

Các phương pháp như String.Format()Console.WriteLine() (và các loại khác) cho phép bạn giới hạn số chữ số chính xác mà giá trị được định dạng.

Cố gắng "cắt ngắn" số dấu phẩy động bị bệnh được khuyên là - số dấu phẩy động không có đại diện thập phân chính xác trong nhiều trường hợp. Áp dụng một cách tiếp cận như mở rộng số lượng, cắt ngắn nó, và sau đó thu nhỏ nó có thể dễ dàng thay đổi giá trị thành một cái gì đó khá khác với những gì bạn mong đợi cho giá trị "cắt ngắn".

Nếu bạn cần quan đại diện thập phân chính xác của một số bạn nên sử dụng decimal hơn double hoặc float.

+0

Điều này tóm tắt tất cả lời khuyên tốt ở một nơi. –

32

Tôi không thể nghĩ ra lý do rõ ràng để mất độ chính xác bên ngoài mục đích hiển thị. Trong trường hợp đó, chỉ cần sử dụng định dạng chuỗi.

double example = 12.34567; 

Console.Out.WriteLine(example.ToString("#.000")); 
+1

+1 để đặt câu hỏi về cơ sở của câu hỏi. –

+4

Tôi cần nó vì tôi khớp các giá trị từ một tệp XML với các giá trị được lưu trữ trong một DB. Cả hai nguồn đều được điền bởi các bên khác nhau. Một trong đó điền vào các Db chọn không điền vào bất cứ điều gì nhiều hơn 3 chữ số thập phân, trong khi các tập tin XML thường có thể có tối đa 8 chữ số thập phân – xbonez

+0

@StevenSudit Và một trường hợp sử dụng có thể, như tôi, là nơi tôi có một lĩnh vực DB chỉ có thể lấy 10 ký tự, nhưng biểu mẫu có một trường lb -> kg trong đó tính toán diễn ra và có thể cho số> 10 ký tự. Đôi khi bạn chỉ muốn một vài chữ số có ý nghĩa và không muốn cắt ngắn hoặc tròn, nhưng có giới hạn về số lượng con số mà bạn có thể lưu trữ. Vì vậy, tôi sẽ downvote đặt câu hỏi này sử dụng trường hợp, vì nó là rất phổ biến khi lưu trữ số trong một lĩnh vực DB, không upvote nó. May mắn là nó có một câu trả lời hữu ích, vì vậy tôi sẽ upvote, thay vào đó. – vapcguy

1

Câu trả lời hay ở trên- nếu bạn đang tìm kiếm thứ gì đó có thể sử dụng lại ở đây là mã. Lưu ý rằng bạn có thể muốn kiểm tra giá trị vị trí thập phân và điều này có thể tràn.

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces) 
{ 
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces)); 

    return Math.Truncate((power * numberToTruncate))/power; 
} 
13
double example = 3.1416789645; 
double output = Convert.ToDouble(example.ToString("N3")); 
+0

Tôi chỉ cần một số chữ số thập phân sau example.Điều này đã giúp. :) –

1

Trong C lang:

double truncKeepDecimalPlaces(double value, int numDecimals) 
{ 
    int x = pow(10, numDecimals); 
    return (double)trunc(value * x)/x; 
} 
Các vấn đề liên quan